[SCM] ardour3/upstream: Imported Upstream version 3.3~dfsg

adiknoth-guest at users.alioth.debian.org adiknoth-guest at users.alioth.debian.org
Thu Aug 8 15:13:57 UTC 2013


The following commit has been merged in the upstream branch:
commit 0ff065a78beb13070fb361a7f59b97583eaff8a4
Author: Adrian Knoth <adi at drcomp.erfurt.thur.de>
Date:   Thu Aug 8 13:47:39 2013 +0200

    Imported Upstream version 3.3~dfsg

diff --git a/.gitignore b/.gitignore
index 48a95b8..f2251ba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
 *.[oa]
 *.o
 *.os
-*.template
 *.binding
 *.so
 *.dylib
diff --git a/foo b/foo
deleted file mode 100644
index e69de29..0000000
diff --git a/gtk2_ardour/add_video_dialog.cc b/gtk2_ardour/add_video_dialog.cc
index a005b74..57938ac 100644
--- a/gtk2_ardour/add_video_dialog.cc
+++ b/gtk2_ardour/add_video_dialog.cc
@@ -42,6 +42,7 @@ using namespace Gtk;
 using namespace std;
 using namespace PBD;
 using namespace ARDOUR;
+using namespace VideoUtils;
 
 #define PREVIEW_WIDTH (240)
 #define PREVIEW_HEIGHT (180)
@@ -482,7 +483,7 @@ AddVideoDialog::harvid_request(std::string u)
 
 	harvid_list->clear();
 
-	char *res = curl_http_get(url, &status);
+	char *res = a3_curl_http_get(url, &status);
 	if (status != 200) {
 		printf("request failed\n"); // XXX
 		harvid_path.set_text(" - request failed -");
@@ -662,7 +663,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 = curl_http_get(url, NULL);
+	char *data = a3_curl_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/ardev_common.sh.in b/gtk2_ardour/ardev_common.sh.in
index 0d802df..897bfcf 100644
--- a/gtk2_ardour/ardev_common.sh.in
+++ b/gtk2_ardour/ardev_common.sh.in
@@ -34,4 +34,5 @@ export LD_LIBRARY_PATH=$libs/qm-dsp:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces
 # DYLD_LIBRARY_PATH is for darwin.
 export DYLD_FALLBACK_LIBRARY_PATH=$LD_LIBRARY_PATH
 
+ARDOURVERSION=@VERSION@
 EXECUTABLE=@EXECUTABLE@
diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in
index f666262..15f1bde 100644
--- a/gtk2_ardour/ardour.menus.in
+++ b/gtk2_ardour/ardour.menus.in
@@ -511,6 +511,7 @@
     </menu>
     <menu action = 'WindowMenu'>
       <menuitem action='toggle-mixer'/>
+      <menuitem action='toggle-meterbridge'/>
       <menuitem action='toggle-editor-mixer'/>
 
       <separator/>
diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in
index 0872fc9..e3978d0 100644
--- a/gtk2_ardour/ardour3_styles.rc.in
+++ b/gtk2_ardour/ardour3_styles.rc.in
@@ -72,9 +72,9 @@ style "gain_fader"
 	bg[ACTIVE] = shade (0.705, @@COLPREFIX at _bg)
 	bg[INSENSITIVE] = shade (0.705, @@COLPREFIX at _bg)
 
-        fg[INSENSITIVE] = { 0.525, 0.521, 0.568 }
-        fg[NORMAL] = { 0.525, 0.521, 0.568 }
-	fg[ACTIVE] = { 0.525, 0.521, 0.568 }
+        fg[INSENSITIVE] = shade(1.4, @@COLPREFIX at _bg)
+        fg[NORMAL] = shade(1.4, @@COLPREFIX at _bg)
+	fg[ACTIVE] = shade(1.4, @@COLPREFIX at _bg)
 }
 
 #MSR and related buttons
@@ -147,6 +147,10 @@ style "monitor" = "small_button"
 {
 }
 
+style "meterbridge_label" = "small_text"
+{
+}
+
 style "solo_isolate" = "very_small_text"
 {
 }
@@ -679,6 +683,7 @@ style "audio_bus_base" = "very_small_text"
 {
   fg[NORMAL] = @@COLPREFIX at _fg
   bg[NORMAL] = @@COLPREFIX at _audio_bus
+  bg[ACTIVE] = @@COLPREFIX at _bg
 }
 
 style "send_strip_base" = "default"
@@ -736,6 +741,11 @@ style "midi_track_metrics" = "midi_track_base"
 	font_name = "@FONT_TINY@"
 }
 
+style "audiomidi_track_metrics" = "midi_track_base"
+{
+	font_name = "@FONT_TINY@"
+}
+
 style "audio_bus_metrics" = "audio_bus_base"
 {
 	font_name = "@FONT_TINY@"
@@ -751,6 +761,11 @@ style "midi_track_metrics_inactive" = "track_controls_inactive"
 	font_name = "@FONT_TINY@"
 }
 
+style "audiomidi_track_metrics_inactive" = "track_controls_inactive"
+{
+	font_name = "@FONT_TINY@"
+}
+
 style "audio_bus_metrics_inactive" = "track_controls_inactive"
 {
 	font_name = "@FONT_TINY@"
@@ -777,7 +792,7 @@ style "track_name_display" = "medium_text"
 
 style "track_separator"
 {
-	bg[NORMAL] = @@COLPREFIX at _fg
+	bg[NORMAL] = lighter(@@COLPREFIX at _bg)
 }
 
 # Plugin Editors
@@ -974,3 +989,25 @@ style "default_toggle_button"
 	bg[ACTIVE] = @@COLPREFIX at _contrasting_indicator
 	fg[ACTIVE] = @@COLPREFIX at _darkest
 }
+
+
+style "meter_strip_dpm" = "default"
+{
+}
+
+style "meter_strip_ppm" = "default"
+{
+  bg[NORMAL] = { 0.1, 0.1, 0.1 }
+  fg[NORMAL] = { 1.0, 1.0, 1.0 }
+}
+
+style "meter_strip_vu" = "default"
+{
+  bg[NORMAL] = { .84, .77, .58 }
+  fg[NORMAL] = { 0.0, 0.0, 0.0 }
+}
+
+style "meter_strip_sep" = "default"
+{
+  bg[NORMAL] = { 0.0, 0.0, 0.0 }
+}
diff --git a/gtk2_ardour/ardour3_ui_default.conf b/gtk2_ardour/ardour3_ui_default.conf
index 7a663ce..7c33944 100644
--- a/gtk2_ardour/ardour3_ui_default.conf
+++ b/gtk2_ardour/ardour3_ui_default.conf
@@ -51,14 +51,28 @@
     <Option name="measure line bar" value="ffffff9c"/>
     <Option name="measure line beat" value="a29e9e76"/>
     <Option name="meter bar" value="626470cc"/>
-    <Option name="meter fill min" value="0000ffff"/>
-    <Option name="meter fill clip" value="ff0000ff"/>
-    <Option name="meter fill mid" value="73f9baff"/>
-    <Option name="meter fill max" value="00fd5dff"/>
-    <Option name="midi meter fill min" value="effaa100"/>
-    <Option name="midi meter fill clip" value="f83913ff"/>
-    <Option name="midi meter fill mid" value="8fc78e00"/>
-    <Option name="midi meter fill max" value="00f45600"/>
+    <Option name="meter fill: 0" value="008800ff"/>
+    <Option name="meter fill: 1" value="008800ff"/>
+    <Option name="meter fill: 2" value="00ff00ff"/>
+    <Option name="meter fill: 3" value="00ff00ff"/>
+    <Option name="meter fill: 4" value="fff000ff"/>
+    <Option name="meter fill: 5" value="fff000ff"/>
+    <Option name="meter fill: 6" value="ff8000ff"/>
+    <Option name="meter fill: 7" value="ff8000ff"/>
+    <Option name="meter fill: 8" value="ff0000ff"/>
+    <Option name="meter fill: 9" value="ff0000ff"/>
+    <Option name="meter background: bottom" value="333333ff"/>
+    <Option name="meter background: top" value="444444ff"/>
+    <Option name="midi meter fill: 0" value="effaa1ff"/>
+    <Option name="midi meter fill: 1" value="f2c97dff"/>
+    <Option name="midi meter fill: 2" value="f2c97dff"/>
+    <Option name="midi meter fill: 3" value="f48f52ff"/>
+    <Option name="midi meter fill: 4" value="f48f52ff"/>
+    <Option name="midi meter fill: 5" value="f83913ff"/>
+    <Option name="midi meter fill: 6" value="f83913ff"/>
+    <Option name="midi meter fill: 7" value="8fc78eff"/>
+    <Option name="midi meter fill: 8" value="8fc78eff"/>
+    <Option name="midi meter fill: 9" value="00f45600"/>
     <Option name="meter marker" value="f2425bff"/>
     <Option name="midi bus base" value="00000000"/>
     <Option name="midi frame base" value="393d3766"/>
@@ -188,6 +202,9 @@
     <Option name="monitor button: led active" value="ff0000ff"/>
     <Option name="monitor button: text" value="aaaaa3ff"/>
     <Option name="monitor button: text active" value="1a1a1aff"/>
+    <Option name="meterbridge label: fill start" value="444444ff"/>
+    <Option name="meterbridge label: fill end" value="333333ff"/>
+    <Option name="meterbridge label: text" value="c7c7d8ff"/>
     <Option name="solo isolate: fill start" value="5f5a58ff"/>
     <Option name="solo isolate: fill end" value="504442ff"/>
     <Option name="solo isolate: fill start active" value="5d5856ff"/>
@@ -204,6 +221,12 @@
     <Option name="solo safe: led active" value="ff0000ff"/>
     <Option name="solo safe: text" value="c7c7d8ff"/>
     <Option name="solo safe: text active" value="c8c8d9ff"/>
+    <Option name="meterbridge peaklabel" value="ff1111ff"/>
+    <Option name="meter color BBC" value="ffa500ff"/>
+    <Option name="meterbridge peakindicator: fill start" value="444444ff"/>
+    <Option name="meterbridge peakindicator: fill end" value="333333ff"/>
+    <Option name="meterbridge peakindicator on: fill start" value="ff0000ff"/>
+    <Option name="meterbridge peakindicator on: fill end" value="880000ff"/>
     <Option name="monitor section cut: fill start" value="5f5a58ff"/>
     <Option name="monitor section cut: fill end" value="4f4a48ff"/>
     <Option name="monitor section cut: fill start active" value="5f4943ff"/>
diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc
index 343075c..0e7075c 100644
--- a/gtk2_ardour/ardour3_widget_list.rc
+++ b/gtk2_ardour/ardour3_widget_list.rc
@@ -169,9 +169,19 @@ widget "*FaderMetricsStrip" style:highest "audio_track_metrics"
 widget "*AudioTrackMetrics" style:highest "audio_track_metrics"
 widget "*MidiTrackMetrics" style:highest "midi_track_metrics"
 widget "*AudioBusMetrics" style:highest "audio_bus_metrics"
+widget "*AudioMidiTrackMetrics" style:highest "midi_track_metrics"
+widget "*AudioTrackMetricsLeft" style:highest "audio_track_metrics"
+widget "*MidiTrackMetricsLeft" style:highest "midi_track_metrics"
+widget "*AudioBusMetricsLeft" style:highest "audio_bus_metrics"
+widget "*AudioMidiTrackMetricsLeft" style:highest "midi_track_metrics"
+widget "*AudioTrackMetricsRight" style:highest "audio_track_metrics"
+widget "*MidiTrackMetricsRight" style:highest "midi_track_metrics"
+widget "*AudioBusMetricsRight" style:highest "audio_bus_metrics"
+widget "*AudioMidiTrackMetricsRight" style:highest "midi_track_metrics"
 widget "*AudioTrackMetricsInactive" style:highest "audio_track_metrics_inactive"
 widget "*MidiTrackMetricsInactive" style:highest "midi_track_metrics_inactive"
 widget "*AudioBusMetricsInactive" style:highest "audio_bus_metrics_inactive"
+widget "*AudioMidiTrackMetricsInactive" style:highest "midi_track_metrics_inactive"
 
 widget "*TimeAxisViewControlsBaseUnselected" style:highest "audio_track_base"
 widget "*AudioTrackControlsBaseUnselected" style:highest "audio_track_base"
@@ -280,6 +290,11 @@ widget "*PluginLoadButton" style:highest "small_button"
 widget "*PluginLoadButton*" style:highest "small_button"
 widget "*PluginEditorButton" style:highest "default_toggle_button"
 
+widget "*meterstripPPM" style:highest "meter_strip_ppm"
+widget "*meterstripDPM" style:highest "meter_strip_dpm"
+widget "*meterstripVU" style:highest "meter_strip_vu"
+widget "*BlackSeparator" style:highest "meter_strip_sep"
+
 widget "*MetricDialogFrame" style:highest "base_frame"
 widget "*MetricEntry" style:highest "medium_bold_entry"
 widget "*MetricButton" style:highest "default_button"
@@ -342,6 +357,7 @@ widget "*ProcessorList*" style:highest "processor_list"
 widget "*PortMatrixLabel*" style:highest "small_text"
 widget "*MidiTracerTextView" style:highest "midi_tracer_textview"
 widget "*solo isolate" style:highest "solo_isolate"
+widget "*meterbridge label" style:highest "meterbridge_label"
 widget "*solo safe" style:highest "solo_safe"
 widget "*ContrastingPopup" style:highest "contrasting_popup"
 widget "*ContrastingPopup*" style:highest "contrasting_popup"
diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc
index a9eabd3..89e6a20 100644
--- a/gtk2_ardour/ardour_button.cc
+++ b/gtk2_ardour/ardour_button.cc
@@ -61,6 +61,9 @@ ArdourButton::ArdourButton (Element e)
 	, _diameter (11.0)
 	, _corner_radius (4.0)
 	, _corner_mask (0xf)
+	, _angle(0)
+	, _xalign(.5)
+	, _yalign(.5)
 	, border_color (0)
 	, fill_color_active (0)
 	, fill_color_inactive (0)
@@ -87,6 +90,9 @@ ArdourButton::ArdourButton (const std::string& str, Element e)
 	, _diameter (11.0)
 	, _corner_radius (4.0)
 	, _corner_mask (0xf)
+	, _angle(0)
+	, _xalign(.5)
+	, _yalign(.5)
 	, border_color (0)
 	, fill_color_active (0)
 	, fill_color_inactive (0)
@@ -161,6 +167,19 @@ ArdourButton::set_markup (const std::string& str)
 }
 
 void
+ArdourButton::set_angle (const double angle)
+{
+	_angle = angle;
+}
+
+void
+ArdourButton::set_alignment (const float xa, const float ya)
+{
+	_xalign = xa;
+	_yalign = ya;
+}
+
+void
 ArdourButton::render (cairo_t* cr)
 {
 	void (*rounded_function)(cairo_t*, double, double, double, double, double);
@@ -285,6 +304,7 @@ ArdourButton::render (cairo_t* cr)
 	if ( ((_elements & Text)==Text) && !_text.empty()) {
 
 		cairo_new_path (cr);	
+		cairo_set_source_rgba (cr, text_r, text_g, text_b, text_a);
 
 		if (_elements & Indicator) {
 			if (_led_left) {
@@ -292,13 +312,37 @@ ArdourButton::render (cairo_t* cr)
 			} else {
 				cairo_move_to (cr, text_margin, get_height()/2.0 - _text_height/2.0);
 			}
+			pango_cairo_show_layout (cr, _layout->gobj());
 		} else {
-			/* center text */
+			/* align text */
+
+			double ww, wh;
+			double xa, ya;
+			ww = get_width();
+			wh = get_height();
+			cairo_save (cr); // TODO retain rotataion.. adj. LED,...
+			cairo_rotate(cr, _angle * M_PI / 180.0);
+			cairo_device_to_user(cr, &ww, &wh);
+			xa = (ww - _text_width) * _xalign;
+			ya = (wh - _text_height) * _yalign;
+
+			/* quick hack for left/bottom alignment at -90deg
+			 * TODO this should be generalized incl rotation.
+			 * currently only 'user' of this API is meter_strip.cc
+			 */
+			if (_xalign < 0) xa = (ww * fabs(_xalign) + text_margin);
+
+			// TODO honor left/right text_margin with min/max()
+
+			cairo_move_to (cr, xa, ya);
+			pango_cairo_update_layout(cr, _layout->gobj());
+			pango_cairo_show_layout (cr, _layout->gobj());
+			cairo_restore (cr);
+
+			/* use old center'ed layout for follow up items - until rotation/aligment code is completed */
 			cairo_move_to (cr, (get_width() - _text_width)/2.0, get_height()/2.0 - _text_height/2.0);
 		}
 
-		cairo_set_source_rgba (cr, text_r, text_g, text_b, text_a);
-		pango_cairo_show_layout (cr, _layout->gobj());
 	} 
 
 	if (((_elements & Indicator)==Indicator)) {
@@ -340,7 +384,7 @@ ArdourButton::render (cairo_t* cr)
 
 	if ((visual_state() & Gtkmm2ext::Insensitive)) {
 		rounded_function (cr, 0, 0, get_width(), get_height(), _corner_radius);
-		cairo_set_source_rgba (cr, 0.505, 0.517, 0.525, 0.5);
+		cairo_set_source_rgba (cr, 0.505, 0.517, 0.525, 0.6);
 		cairo_fill (cr);
 	}
 
@@ -357,7 +401,8 @@ ArdourButton::render (cairo_t* cr)
 
 	/* if requested, show hovering */
 	
-	if (ARDOUR::Config->get_widget_prelight()) {
+	if (ARDOUR::Config->get_widget_prelight()
+			&& !((visual_state() & Gtkmm2ext::Insensitive))) {
 		if (_hovering) {
 			rounded_function (cr, 0, 0, get_width(), get_height(), _corner_radius);
 			cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.2);
@@ -376,6 +421,7 @@ ArdourButton::set_diameter (float d)
 	}
 
 	set_colors ();
+	queue_resize ();
 }
 
 void
@@ -398,7 +444,7 @@ ArdourButton::on_size_request (Gtk::Requisition* req)
 		if (_text_width + _diameter < 75) {
 			xpad = 7;
 		} else {
-			xpad = 20;
+			xpad = 12;
 		}
 	} else {
 		_text_width = 0;
@@ -414,7 +460,7 @@ ArdourButton::on_size_request (Gtk::Requisition* req)
 			req->width = _pixbuf->get_width() + lrint (_diameter) + xpad;
 			req->height = max (_pixbuf->get_height(), (int) lrint (_diameter)) + ypad;
 		} else {
-			req->width = _text_width + lrint (_diameter) + xpad;
+			req->width = _text_width + lrint (_diameter) + xpad * 2; // margin left+right * 2
 			req->height = max (_text_height, (int) lrint (_diameter)) + ypad;
 		}
         } else {
diff --git a/gtk2_ardour/ardour_button.h b/gtk2_ardour/ardour_button.h
index df5b115..efa9561 100644
--- a/gtk2_ardour/ardour_button.h
+++ b/gtk2_ardour/ardour_button.h
@@ -73,6 +73,9 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
 
 	void set_text (const std::string&);
 	void set_markup (const std::string&);
+	void set_angle (const double);
+	void set_alignment (const float, const float);
+	void get_alignment (float& xa, float& ya) {xa = _xalign; ya = _yalign;};
 
 	void set_led_left (bool yn);
 	void set_distinct_led_click (bool yn);
@@ -118,6 +121,9 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
 	float _corner_radius;
 	int   _corner_mask;
 
+	double _angle;
+	float _xalign, _yalign;
+
 	uint32_t bg_color;
 	uint32_t border_color;
 	uint32_t fill_color_active;
diff --git a/gtk2_ardour/ardour_image_compositor_socket.h b/gtk2_ardour/ardour_image_compositor_socket.h
deleted file mode 100644
index 88e9e37..0000000
--- a/gtk2_ardour/ardour_image_compositor_socket.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
-    Copyright (C) 2003 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_image_comp_h__
-#define __ardour_image_comp_h__
-
-#include <string>
-
-namespace ardourvis
-{
-	/** Simple version number */
-	const int32_t MSG_VERSION = 1 ;
-
-	/** the default port we use */
-	const int32_t DEFAULT_PORT = 30000 ;
-
-	/** the maximum buffer size we will use to send receive a message (image data handled differently) */
-	const int32_t MAX_MSG_SIZE = 256 ;
-
-	/** the number of characters used for a value describing the characters within a textual data element */
-	const int32_t TEXT_SIZE_CHARS = 3 ;
-
-	/** the number of characters we use for time values within a message */
-	const int32_t TIME_VALUE_CHARS = 10 ;
-
-	/** the number of charachters we use for other value data, ie image width/height values */
-	const int32_t IMAGE_SIZE_CHARS = 3 ;
-
-	/** the number of characters used to for the size of the image data message */
-	const int32_t IMAGE_DATA_MESSAGE_SIZE_CHARS = 32 ;
-
-	// ------------------------------------------------------------------------- //
-	// Main Actions
-	// we join the action chars with items to create the message
-	// with the exception of the return values, all messages begin with one
-	// of these message parts
-
-	/** Insert an Item */
-	const std::string INSERT_ITEM = "IN" ;
-
-	/** Remove an Item */
-	const std::string REMOVE_ITEM = "RM" ;
-
-	/** Rename a named item */
-	const std::string RENAME_ITEM = "MV" ;
-
-	/** Request some aditional data */
-	const std::string REQUEST_DATA = "RQ" ;
-
-	/** Return of a data request */
-	const std::string RETURN_DATA = "RD" ;
-
-	/** Update a item */
-	const std::string ITEM_UPDATE = "IU" ;
-
-	/** Select an Item */
-	const std::string ITEM_SELECTED = "IS" ;
-
-	/** Sesion Action */
-	const std::string SESSION_ACTION = "SA" ;
-
-	/** Sesion Action */
-	const std::string SHUTDOWN = "SD" ;
-
-
-	// ------------------------------------------------------------------------- //
-	// Return values
-	const std::string RETURN_TRUE  = "RT1" ;
-	const std::string RETURN_FALSE = "RT0" ;
-
-
-
-	// ------------------------------------------------------------------------- //
-	// Updateable attributes
-
-	/** Update the position of a time axis item */
-	const std::string POSITION_CHANGE = "PC" ;
-
-	/** Update the duration of a time axis item */
-	const std::string DURATION_CHANGE = "DC" ;
-
-	/** Enable the position lock constraint no a time axis item */
-	const std::string POSITION_LOCK_CHANGE = "PL" ;
-
-	/** Enable the duration lock constraint no a time axis item */
-	const std::string DURATION_LOCK_CHANGE = "PL" ;
-
-	/** Update the Maximum duration of a time axis item (_Upper _Duration) */
-	const std::string MAX_DURATION_CHANGE = "UD" ;
-
-	/** Enable the Maximum duration constraint of a time axis item (_Enable _Upper (Duration)) */
-	const std::string MAX_DURATION_ENABLE_CHANGE = "EU" ;
-
-	/** Update the Minimum duration of a time axis item (_Lowerr _Duration) */
-	const std::string MIN_DURATION_CHANGE = "LD" ;
-
-	/** Enable the Minimum duration constraint of a time axis item (_Enable _Lower (Duration)) */
-	const std::string MIN_DURATION_ENABLE_CHANGE = "EL" ;
-
-	/** Refresh the image data of an imageframe item (original image has been altered?) */
-	const std::string IMAGE_REFRESH = "IR" ;
-
-	/** the session sample rate has changed */
-	const std::string SAMPLE_RATE_CHANGE = "RC" ;
-
-
-
-	// ------------------------------------------------------------------------- //
-	// Requestable data items
-
-	/** RGB data of the iamge */
-	// this is probably a bad choice of string !
-	const std::string IMAGE_RGB_DATA = "ID" ;
-
-	/** the (path) name of the Ardour session */
-	const std::string SESSION_NAME = "SN" ;
-
-	/** the current sample rate */
-	const std::string SAMPLE_RATE = "SR" ;
-
-	/** the (path) name of the image compositor session */
-	const std::string COMPOSITOR_SESSION = "CS" ;
-
-
-	// ------------------------------------------------------------------------- //
-	// Session Actions - follwed by session path
-
-	/** Close a session */
-	const std::string CLOSE_SESSION = "CS" ;
-
-	/** Open a session */
-	const std::string OPEN_SESSION = "OS" ;
-
-
-
-	// ------------------------------------------------------------------------- //
-	// Items
-
-	const std::string IMAGEFRAME_TIME_AXIS = "IT" ;
-	const std::string MARKER_TIME_AXIS = "MT" ;
-	const std::string IMAGEFRAME_ITEM = "II" ;
-	const std::string MARKER_ITEM = "MI" ;
-
-	/** or an ImageFrameTimeAxisGroup */
-	const std::string IMAGEFRAME_GROUP = "IG" ;
-
-} /* namespace ardour_visual */
-
-#endif /* __ardour_image_comp_socket_h__ */
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 346fcc3..97726cd 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -153,6 +153,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 	  /* big clock */
 
 	, big_clock (new AudioClock (X_("bigclock"), false, "big", true, true, false, false))
+	, video_timeline(0)
 
 	  /* start of private members */
 
@@ -180,6 +181,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 	, solo_alert_button (_("solo"))
 	, feedback_alert_button (_("feedback"))
 
+	, editor_meter(0)
+	, editor_meter_peak_display()
+
 	, speaker_config_window (X_("speaker-config"), _("Speaker Configuration"))
 	, theme_manager (X_("theme-manager"), _("Theme Manager"))
 	, key_editor (X_("key-editor"), _("Key Bindings"))
@@ -213,6 +217,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 
 	editor = 0;
 	mixer = 0;
+	meterbridge = 0;
 	editor = 0;
 	engine = 0;
 	_session_is_new = false;
@@ -509,6 +514,7 @@ ARDOUR_UI::~ARDOUR_UI ()
 	delete keyboard;
 	delete editor;
 	delete mixer;
+	delete meterbridge;
 
 	stop_video_server();
 }
@@ -895,11 +901,11 @@ If you still wish to quit, please use the\n\n\
 
 		second_connection.disconnect ();
 		point_one_second_connection.disconnect ();
-		point_oh_five_second_connection.disconnect ();
-		point_zero_one_second_connection.disconnect();
+		point_zero_something_second_connection.disconnect();
 	}
 
 	delete ARDOUR_UI::instance()->video_timeline;
+	ARDOUR_UI::instance()->video_timeline = NULL;
 	stop_video_server();
 
 	/* Save state before deleting the session, as that causes some
@@ -1025,11 +1031,20 @@ ARDOUR_UI::every_point_one_seconds ()
 }
 
 gint
-ARDOUR_UI::every_point_zero_one_seconds ()
+ARDOUR_UI::every_point_zero_something_seconds ()
 {
-	// august 2007: actual update frequency: 40Hz, not 100Hz
+	// august 2007: actual update frequency: 25Hz (40ms), not 100Hz
 
 	SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
+	if (editor_meter && Config->get_show_editor_meter()) {
+		float mpeak = editor_meter->update_meters();
+		if (mpeak > editor_meter_max_peak) {
+			if (mpeak >= Config->get_meter_peak()) {
+				editor_meter_peak_display.set_name ("meterbridge peakindicator on");
+				editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+			}
+		}
+	}
 	return TRUE;
 }
 
@@ -1485,7 +1500,14 @@ ARDOUR_UI::open_session ()
 			open_session_selector->set_current_folder(Config->get_default_session_parent_dir());
 		}
 
-		open_session_selector->add_shortcut_folder (Config->get_default_session_parent_dir());
+		string default_session_folder = Config->get_default_session_parent_dir();
+		try {
+			/* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
+			open_session_selector->add_shortcut_folder (default_session_folder);
+		}
+		catch (Glib::Error & e) {
+			std::cerr << "open_session_selector->add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl;
+		}
 
 		FileFilter session_filter;
 		session_filter.add_pattern ("*.ardour");
@@ -3474,8 +3496,12 @@ ARDOUR_UI::add_video (Gtk::Window* float_window)
 	add_video_dialog->hide();
 	if (r != RESPONSE_ACCEPT) { return; }
 
-	bool local_file;
+	bool local_file, orig_local_file;
 	std::string path = add_video_dialog->file_name(local_file);
+
+	std::string orig_path = path;
+	orig_local_file = local_file;
+
 	bool auto_set_session_fps = add_video_dialog->auto_set_session_fps();
 
 	if (local_file && !Glib::file_test(path, Glib::FILE_TEST_EXISTS)) {
@@ -3499,7 +3525,10 @@ ARDOUR_UI::add_video (Gtk::Window* float_window)
 					return;
 				}
 				if (!transcode_video_dialog->get_audiofile().empty()) {
-					editor->embed_audio_from_video(transcode_video_dialog->get_audiofile());
+					editor->embed_audio_from_video(
+							transcode_video_dialog->get_audiofile(),
+							video_timeline->get_offset()
+							);
 				}
 				switch (transcode_video_dialog->import_option()) {
 					case VTL_IMPORT_TRANSCODED:
@@ -3534,6 +3563,11 @@ ARDOUR_UI::add_video (Gtk::Window* float_window)
 		node->add_property (X_("Filename"), path);
 		node->add_property (X_("AutoFPS"), auto_set_session_fps?X_("1"):X_("0"));
 		node->add_property (X_("LocalFile"), local_file?X_("1"):X_("0"));
+		if (orig_local_file) {
+			node->add_property (X_("OriginalVideoFile"), orig_path);
+		} else {
+			node->remove_property (X_("OriginalVideoFile"));
+		}
 		_session->add_extra_xml (*node);
 		_session->set_dirty ();
 
@@ -3558,14 +3592,16 @@ ARDOUR_UI::remove_video ()
 	video_timeline->close_session();
 	editor->toggle_ruler_video(false);
 
+	/* reset state */
+	video_timeline->set_offset_locked(false);
+	video_timeline->set_offset(0);
+
 	/* delete session state */
 	XMLNode* node = new XMLNode(X_("Videotimeline"));
 	_session->add_extra_xml(*node);
 	node = new XMLNode(X_("Videomonitor"));
 	_session->add_extra_xml(*node);
 	stop_video_server();
-
-	editor->set_close_video_sensitive(false);
 }
 
 void
@@ -4097,3 +4133,32 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat
 
 	msg.run ();
 }
+
+
+void
+ARDOUR_UI::reset_peak_display ()
+{
+	if (!_session || !_session->master_out() || !editor_meter) return;
+	editor_meter->clear_meters();
+	editor_meter_max_peak = -INFINITY;
+	editor_meter_peak_display.set_name ("meterbridge peakindicator");
+	editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+}
+
+void
+ARDOUR_UI::reset_group_peak_display (RouteGroup* group)
+{
+	if (!_session || !_session->master_out()) return;
+	if (group == _session->master_out()->route_group()) {
+		reset_peak_display ();
+	}
+}
+
+void
+ARDOUR_UI::reset_route_peak_display (Route* route)
+{
+	if (!_session || !_session->master_out()) return;
+	if (_session->master_out().get() == route) {
+		reset_peak_display ();
+	}
+}
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 0ed5d14..6365e28 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -71,6 +71,7 @@
 #include "ardour_dialog.h"
 #include "ardour_window.h"
 #include "editing.h"
+#include "meterbridge.h"
 #include "nsm.h"
 #include "ui_config.h"
 #include "enums.h"
@@ -103,6 +104,7 @@ class SpeakerDialog;
 class ThemeManager;
 class TimeInfoBox;
 class MidiTracer;
+class LevelMeterHBox;
 class GlobalPortMatrixWindow;
 class GUIObjectState;
 
@@ -176,10 +178,17 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 
 	static PublicEditor* _instance;
 	static sigc::signal<void,bool> Blink;
+
+	/** point_zero_one_seconds -- 10Hz ^= 100ms */
 	static sigc::signal<void>      RapidScreenUpdate;
+
+	/** point_zero_something_seconds -- currently 25Hz ^= 40ms */
 	static sigc::signal<void>      SuperRapidScreenUpdate;
+
 	/** Emitted frequently with the audible frame, false, and the edit point as
 	 *  parameters respectively.
+	 *
+	 *  (either RapidScreenUpdate || SuperRapidScreenUpdate - user-config)
 	 */
 	static sigc::signal<void, framepos_t, bool, framepos_t> Clock;
 
@@ -273,6 +282,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	void get_process_buffers ();
 	void drop_process_buffers ();
 
+	void reset_peak_display ();
+	void reset_route_peak_display (ARDOUR::Route*);
+	void reset_group_peak_display (ARDOUR::RouteGroup*);
+
         const std::string& announce_string() const { return _announce_string; }
 
   protected:
@@ -306,6 +319,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	void goto_editor_window ();
 	void goto_mixer_window ();
 	void toggle_mixer_window ();
+	void toggle_meterbridge ();
         void toggle_editor_mixer ();
 
 	int  setup_windows ();
@@ -435,6 +449,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	ArdourButton feedback_alert_button;
 
 	Gtk::VBox alert_box;
+	Gtk::VBox meter_box;
+	LevelMeterHBox * editor_meter;
+	float            editor_meter_max_peak;
+	ArdourButton     editor_meter_peak_display;
+	bool             editor_meter_peak_button_release (GdkEventButton*);
 
 	void solo_blink (bool);
 	void sync_blink (bool);
@@ -519,12 +538,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	
 	gint every_second ();
 	gint every_point_one_seconds ();
-	gint every_point_zero_one_seconds ();
+	gint every_point_zero_something_seconds ();
 
 	sigc::connection second_connection;
 	sigc::connection point_one_second_connection;
-	sigc::connection point_oh_five_second_connection;
-	sigc::connection point_zero_one_second_connection;
+	sigc::connection point_zero_something_second_connection;
 
 	void open_session ();
 	void open_recent_session ();
@@ -570,6 +588,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	PublicEditor     *editor;
 	int         create_editor ();
 
+	Meterbridge  *meterbridge;
+	int         create_meterbridge ();
         /* Dialogs that can be created via new<T> */
 
         WM::Proxy<SpeakerDialog> speaker_config_window;
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index 76396e8..e9ad631 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -78,6 +78,11 @@ ARDOUR_UI::setup_windows ()
 		return -1;
 	}
 
+	if (create_meterbridge ()) {
+		error << _("UI: cannot setup meterbridge") << endmsg;
+		return -1;
+	}
+
 	/* all other dialogs are created conditionally */
 
 	we_have_dependents ();
@@ -139,6 +144,7 @@ ARDOUR_UI::setup_tooltips ()
 	set_tip (feedback_alert_button, _("When active, there is a feedback loop."));
 	set_tip (primary_clock, _("<b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times.\n"));
 	set_tip (secondary_clock, _("<b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times.\n"));
+	set_tip (editor_meter_peak_display, _("Reset Level Meter"));
 
 	synchronize_sync_source_and_video_pullup ();
 
@@ -412,6 +418,8 @@ ARDOUR_UI::setup_transport ()
                 transport_tearoff_hbox.pack_start (_editor_transport_box, false, false);
         }
 	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);
 
 	if (Profile->get_sae()) {
 		Image* img = manage (new Image ((::get_icon (X_("sae")))));
@@ -612,11 +620,10 @@ ARDOUR_UI::click_button_clicked (GdkEventButton* ev)
 		return false;
 	}
 
-	RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleRCOptionsEditor"));
+	RefPtr<Action> act = ActionManager::get_action (X_("Window"), X_("toggle-rc-options-editor"));
 	assert (act);
 
-	RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
-	tact->set_active ();
+	act->activate();
 
 	rc_option_editor->set_current_page (_("Misc"));
 	return true;
diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc
index 5269bb9..8213827 100644
--- a/gtk2_ardour/ardour_ui_dependents.cc
+++ b/gtk2_ardour/ardour_ui_dependents.cc
@@ -78,6 +78,7 @@ ARDOUR_UI::connect_dependents_to_session (ARDOUR::Session *s)
 	editor->set_session (s);
 	BootMessage (_("Setup Mixer"));
 	mixer->set_session (s);
+	meterbridge->set_session (s);
 
 	/* its safe to do this now */
 
diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc
index 3ff625a..24f6511 100644
--- a/gtk2_ardour/ardour_ui_dialogs.cc
+++ b/gtk2_ardour/ardour_ui_dialogs.cc
@@ -39,6 +39,7 @@
 #include "keyeditor.h"
 #include "location_ui.h"
 #include "main_clock.h"
+#include "meter_patterns.h"
 #include "midi_tracer.h"
 #include "mixer_ui.h"
 #include "public_editor.h"
@@ -52,6 +53,8 @@
 #include "theme_manager.h"
 #include "time_info_box.h"
 
+#include <gtkmm2ext/keyboard.h>
+
 #include "i18n.h"
 
 using namespace ARDOUR;
@@ -65,16 +68,9 @@ ARDOUR_UI::set_session (Session *s)
 {
 	SessionHandlePtr::set_session (s);
 
-	if (audio_port_matrix) {
-		audio_port_matrix->set_session (s);
-	}
-
-	if (midi_port_matrix) {
-		midi_port_matrix->set_session (s);
-	}
-
 
 	if (!_session) {
+		WM::Manager::instance().set_session (s);
 		/* Session option editor cannot exist across change-of-session */
 		session_option_editor.drop_window ();
 		/* Ditto for AddVideoDialog */
@@ -94,9 +90,10 @@ ARDOUR_UI::set_session (Session *s)
 		}
 	}
 
-	AutomationWatch::instance().set_session (s);
 	WM::Manager::instance().set_session (s);
 
+	AutomationWatch::instance().set_session (s);
+
 	if (shuttle_box) {
 		shuttle_box->set_session (s);
 	}
@@ -189,9 +186,48 @@ ARDOUR_UI::set_session (Session *s)
 
 	second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second), 1000);
 	point_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
-	point_zero_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
+	point_zero_something_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds), 40);
 
 	update_format ();
+
+	if (editor_meter) {
+		meter_box.remove(*editor_meter);
+		delete editor_meter;
+		editor_meter = 0;
+		editor_meter_peak_display.hide();
+	}
+
+	if (_session && _session->master_out()) {
+		editor_meter = new LevelMeterHBox(_session);
+		editor_meter->set_meter (_session->master_out()->shared_peak_meter().get());
+		editor_meter->clear_meters();
+		editor_meter->set_type (_session->master_out()->meter_type());
+		editor_meter->setup_meters (30, 12, 6);
+		editor_meter->show();
+		meter_box.pack_start(*editor_meter);
+
+		ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display));
+		ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display));
+		ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display));
+
+		editor_meter_peak_display.set_name ("meterbridge peakindicator");
+		editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+		editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS);
+		editor_meter_peak_display.set_size_request(6, -1);
+		editor_meter_peak_display.set_corner_radius(2);
+
+		editor_meter_max_peak = -INFINITY;
+		editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
+
+		if (Config->get_show_editor_meter()) {
+			meter_box.show();
+			editor_meter_peak_display.show();
+		} else {
+			meter_box.hide();
+			editor_meter_peak_display.hide();
+		}
+	}
+
 }
 
 int
@@ -220,18 +256,29 @@ ARDOUR_UI::unload_session (bool hide_stuff)
 	if (hide_stuff) {
 		editor->hide ();
 		mixer->hide ();
+		meterbridge->hide ();
 		theme_manager->hide ();
+		audio_port_matrix->hide();
+		midi_port_matrix->hide();
+		route_params->hide();
 	}
 
 	second_connection.disconnect ();
 	point_one_second_connection.disconnect ();
-	point_oh_five_second_connection.disconnect ();
-	point_zero_one_second_connection.disconnect();
+	point_zero_something_second_connection.disconnect();
+
+	if (editor_meter) {
+		meter_box.remove(*editor_meter);
+		delete editor_meter;
+		editor_meter = 0;
+		editor_meter_peak_display.hide();
+	}
 
 	ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
 
 	rec_button.set_sensitive (false);
 
+	WM::Manager::instance().set_session ((ARDOUR::Session*) 0);
 	ARDOUR_UI::instance()->video_timeline->close_session();
 
 	stop_blinking ();
@@ -320,6 +367,23 @@ ARDOUR_UI::toggle_mixer_window ()
 }
 
 void
+ARDOUR_UI::toggle_meterbridge ()
+{
+	Glib::RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-meterbridge"));
+	if (!act) {
+		return;
+	}
+
+	Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+
+	if (tact->get_active()) {
+		meterbridge->show_window ();
+	} else {
+		meterbridge->hide_window (NULL);
+	}
+}
+
+void
 ARDOUR_UI::toggle_editor_mixer ()
 {
 	bool obscuring = false;
@@ -482,3 +546,18 @@ ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window
 
 	return false;
 }
+
+bool
+ARDOUR_UI::editor_meter_peak_button_release (GdkEventButton* ev)
+{
+	if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier|Gtkmm2ext::Keyboard::TertiaryModifier)) {
+		ArdourMeter::ResetAllPeakDisplays ();
+	} else if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) {
+		if (_session->master_out()) {
+			ArdourMeter::ResetGroupPeakDisplays (_session->master_out()->route_group());
+		}
+	} else if (_session->master_out()) {
+		ArdourMeter::ResetRoutePeakDisplays (_session->master_out().get());
+	}
+	return true;
+}
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index b6ba025..6c05057 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -229,6 +229,7 @@ ARDOUR_UI::install_actions ()
 
 	ActionManager::register_toggle_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_toggle_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));
 	ActionManager::session_sensitive_actions.push_back (act);
@@ -602,7 +603,7 @@ ARDOUR_UI::use_menubar_as_top_menubar ()
 void
 ARDOUR_UI::save_ardour_state ()
 {
-	if (!keyboard || !mixer || !editor) {
+	if (!keyboard || !mixer || !editor || !meterbridge) {
 		return;
 	}
 
@@ -657,10 +658,12 @@ ARDOUR_UI::save_ardour_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 (enode);
 		_session->add_instant_xml (mnode);
+		_session->add_instant_xml (bnode);
 		if (location_ui) {
 			_session->add_instant_xml (location_ui->ui().get_state ());
 		}
diff --git a/gtk2_ardour/ardour_ui_mixer.cc b/gtk2_ardour/ardour_ui_mixer.cc
index 2604e82..a2669f9 100644
--- a/gtk2_ardour/ardour_ui_mixer.cc
+++ b/gtk2_ardour/ardour_ui_mixer.cc
@@ -26,6 +26,7 @@
 #include "actions.h"
 #include "ardour_ui.h"
 #include "mixer_ui.h"
+#include "meterbridge.h"
 
 #include "i18n.h"
 
@@ -50,3 +51,22 @@ ARDOUR_UI::create_mixer ()
 	return 0;
 }
 
+
+int
+ARDOUR_UI::create_meterbridge ()
+
+{
+	try {
+		meterbridge = Meterbridge::instance ();
+	}
+
+	catch (failed_constructor& err) {
+		return -1;
+	}
+
+	meterbridge->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), false));
+	meterbridge->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/toggle-meterbridge")));
+
+	return 0;
+}
+
diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc
index 8cb1376..6b2c9da 100644
--- a/gtk2_ardour/ardour_ui_options.cc
+++ b/gtk2_ardour/ardour_ui_options.cc
@@ -413,6 +413,15 @@ ARDOUR_UI::parameter_changed (std::string p)
 	} else if (p == "super-rapid-clock-update") {
 		stop_clocking ();
 		start_clocking ();
+	} else if (p == "show-editor-meter") {
+		bool show = Config->get_show_editor_meter();
+		if (editor_meter && show) {
+			meter_box.show();
+			editor_meter_peak_display.show();
+		} else if (editor_meter && !show) {
+			meter_box.hide();
+			editor_meter_peak_display.hide();
+		}
 	}
 }
 
diff --git a/gtk2_ardour/ardour_window.cc b/gtk2_ardour/ardour_window.cc
index 3d33b14..ab9d72d 100644
--- a/gtk2_ardour/ardour_window.cc
+++ b/gtk2_ardour/ardour_window.cc
@@ -84,7 +84,6 @@ ArdourWindow::on_unmap ()
 bool
 ArdourWindow::on_delete_event (GdkEventAny*)
 {
-	hide ();
 	return false;
 }
 
diff --git a/gtk2_ardour/au_pluginui.mm b/gtk2_ardour/au_pluginui.mm
index 7bebcee..bbae272 100644
--- a/gtk2_ardour/au_pluginui.mm
+++ b/gtk2_ardour/au_pluginui.mm
@@ -658,7 +658,7 @@ AUPluginUI::parent_cocoa_window ()
 
 	/* move the au_view down so that it doesn't overlap the top_box contents */
 
-	NSPoint origin = { 0, a.height };
+	NSPoint origin = { 0, static_cast<CGFloat> (a.height) };
 
 	[au_view setFrameOrigin:origin];
         [view addSubview:au_view positioned:NSWindowBelow relativeTo:nil]; 
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc
index a0b48b3..c658160 100644
--- a/gtk2_ardour/audio_clock.cc
+++ b/gtk2_ardour/audio_clock.cc
@@ -997,18 +997,18 @@ AudioClock::set_slave_info ()
 
 		switch (sync_src) {
 		case JACK:
-			_left_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%2</span></span>",
+			_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2</span></span>",
 						INFO_FONT_SIZE, sync_source_to_string(sync_src, true)));
 			_right_layout->set_text ("");
 			break;
 		case MIDIClock:
 			if (slave) {
-				_left_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%2</span></span>",
+				_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2</span></span>",
 							INFO_FONT_SIZE, sync_source_to_string(sync_src, true)));
-				_right_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%2</span></span>",
+				_right_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2</span></span>",
 							INFO_FONT_SIZE, slave->approximate_current_delta()));
 			} else {
-				_left_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%2</span></span>",
+				_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2</span></span>",
 							INFO_FONT_SIZE, _("--pending--")));
 				_right_layout->set_text ("");
 			}
@@ -1020,21 +1020,21 @@ AudioClock::set_slave_info ()
 				TimecodeSlave* tcslave;
 				if ((tcslave = dynamic_cast<TimecodeSlave*>(_session->slave())) != 0) {
 					matching = (tcslave->apparent_timecode_format() == _session->config.get_timecode_format());
-					_left_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%2</span><span foreground=\"%3\">%4</span></span>",
+					_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2</span><span foreground=\"%3\">%4</span></span>",
 										  INFO_FONT_SIZE, sync_source_to_string(sync_src, true)[0], (matching?"green":"red"),
 										  dynamic_cast<TimecodeSlave*>(slave)->approximate_current_position()));
-					_right_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%2</span></span>",
+					_right_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2</span></span>",
 										   INFO_FONT_SIZE, slave->approximate_current_delta()));
 				}
 			} else {
-				_left_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%2</span></span>",
+				_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2</span></span>",
 							INFO_FONT_SIZE, _("--pending--")));
 				_right_layout->set_text ("");
 			}
 			break;
 		}
 	} else {
-		_left_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"INT/%2</span></span>",
+		_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "INT/%2</span></span>",
 					INFO_FONT_SIZE, sync_source_to_string(sync_src, true)));
 		_right_layout->set_text ("");
 	}
@@ -1079,17 +1079,17 @@ AudioClock::set_frames (framepos_t when, bool /*force*/)
 			sprintf (buf, "%" PRId64 "Hz", rate);
 		}
 
-		_left_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%2 </span><span foreground=\"green\">%3</span></span>",
+		_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2 </span><span foreground=\"green\">%3</span></span>",
 				INFO_FONT_SIZE, _("SR"), buf));
 
 		float vid_pullup = _session->config.get_video_pullup();
 
 		if (vid_pullup == 0.0) {
-			_right_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%2 </span><span foreground=\"green\">off</span></span>",
+			_right_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2 </span><span foreground=\"green\">off</span></span>",
 					INFO_FONT_SIZE, _("Pull")));
 		} else {
 			sprintf (buf, _("%+.4f%%"), vid_pullup);
-			_right_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%2 </span><span foreground=\"green\">%3</span></span>",
+			_right_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2 </span><span foreground=\"green\">%3</span></span>",
 					INFO_FONT_SIZE, _("Pull"), buf));
 		}
 	}
@@ -1233,11 +1233,11 @@ 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());
-		_left_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%3</span> <span foreground=\"green\">%2</span></span>",
+		_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%3</span> <span foreground=\"green\">%2</span></span>",
 							  INFO_FONT_SIZE, buf, _("Tempo")));
 
 		sprintf (buf, "%g/%g", m.meter().divisions_per_bar(), m.meter().note_divisor());
-		_right_layout->set_markup (string_compose ("<span size=\"%1\">"TXTSPAN"%3</span> <span foreground=\"green\">%2</span></span>",
+		_right_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%3</span> <span foreground=\"green\">%2</span></span>",
 							   INFO_FONT_SIZE, buf, _("Meter")));
 	}
 }
@@ -2013,7 +2013,7 @@ framepos_t
 AudioClock::frame_duration_from_bbt_string (framepos_t pos, const string& str) const
 {
 	if (_session == 0) {
-		error << "AudioClock::current_time() called with BBT mode but without session!" << endmsg;
+		error << "AudioClock::frame_duration_from_bbt_string() called with BBT mode but without session!" << endmsg;
 		return 0;
 	}
 
diff --git a/gtk2_ardour/canvas.h b/gtk2_ardour/canvas.h
index 1bf3be9..1139da5 100644
--- a/gtk2_ardour/canvas.h
+++ b/gtk2_ardour/canvas.h
@@ -34,7 +34,6 @@ namespace Gnome {
 		class Line;
 		class Points;
 		class Pixbuf;
-		class ImageFrame;
 		class LineSet;
 	}
 }
diff --git a/gtk2_ardour/canvas_vars.h b/gtk2_ardour/canvas_vars.h
index 97e58dd..34116c8 100644
--- a/gtk2_ardour/canvas_vars.h
+++ b/gtk2_ardour/canvas_vars.h
@@ -64,14 +64,37 @@ CANVAS_VARIABLE(canvasvar_MarkerTrack, "marker track")
 CANVAS_VARIABLE(canvasvar_MeasureLineBar, "measure line bar")
 CANVAS_VARIABLE(canvasvar_MeasureLineBeat, "measure line beat")
 CANVAS_VARIABLE(canvasvar_MeterBar, "meter bar")
-CANVAS_VARIABLE(canvasvar_MeterColorBase, "meter fill min")
-CANVAS_VARIABLE(canvasvar_MeterColorClip, "meter fill clip")
-CANVAS_VARIABLE(canvasvar_MeterColorMid, "meter fill mid")
-CANVAS_VARIABLE(canvasvar_MeterColorTop, "meter fill max")
-CANVAS_VARIABLE(canvasvar_MidiMeterColorBase, "midi meter fill min")
-CANVAS_VARIABLE(canvasvar_MidiMeterColorClip, "midi meter fill clip")
-CANVAS_VARIABLE(canvasvar_MidiMeterColorMid, "midi meter fill mid")
-CANVAS_VARIABLE(canvasvar_MidiMeterColorTop, "midi meter fill max")
+CANVAS_VARIABLE(canvasvar_MeterBridgePeakLabel, "meterbridge peaklabel")
+CANVAS_VARIABLE(canvasvar_MeterColorBBC, "meter color BBC")
+CANVAS_VARIABLE(canvasvar_MeterColor0, "meter fill: 0")
+CANVAS_VARIABLE(canvasvar_MeterColor1, "meter fill: 1")
+CANVAS_VARIABLE(canvasvar_MeterColor2, "meter fill: 2")
+CANVAS_VARIABLE(canvasvar_MeterColor3, "meter fill: 3")
+CANVAS_VARIABLE(canvasvar_MeterColor4, "meter fill: 4")
+CANVAS_VARIABLE(canvasvar_MeterColor5, "meter fill: 5")
+CANVAS_VARIABLE(canvasvar_MeterColor6, "meter fill: 6")
+CANVAS_VARIABLE(canvasvar_MeterColor7, "meter fill: 7")
+CANVAS_VARIABLE(canvasvar_MeterColor8, "meter fill: 8")
+CANVAS_VARIABLE(canvasvar_MeterColor9, "meter fill: 9")
+CANVAS_VARIABLE(canvasvar_MidiMeterColor0, "midi meter fill: 0")
+CANVAS_VARIABLE(canvasvar_MidiMeterColor1, "midi meter fill: 1")
+CANVAS_VARIABLE(canvasvar_MidiMeterColor2, "midi meter fill: 2")
+CANVAS_VARIABLE(canvasvar_MidiMeterColor3, "midi meter fill: 3")
+CANVAS_VARIABLE(canvasvar_MidiMeterColor4, "midi meter fill: 4")
+CANVAS_VARIABLE(canvasvar_MidiMeterColor5, "midi meter fill: 5")
+CANVAS_VARIABLE(canvasvar_MidiMeterColor6, "midi meter fill: 6")
+CANVAS_VARIABLE(canvasvar_MidiMeterColor7, "midi meter fill: 7")
+CANVAS_VARIABLE(canvasvar_MidiMeterColor8, "midi meter fill: 8")
+CANVAS_VARIABLE(canvasvar_MidiMeterColor9, "midi meter fill: 9")
+CANVAS_VARIABLE(canvasvar_MeterBackgroundBot, "meter background: bottom")
+CANVAS_VARIABLE(canvasvar_MeterBackgroundTop, "meter background: top")
+CANVAS_VARIABLE(canvasvar_MeterBridgePeakindicatorOffFillStart, "meterbridge peakindicator: fill start")
+CANVAS_VARIABLE(canvasvar_MeterBridgePeakindicatorOffFillEnd, "meterbridge peakindicator: fill end")
+CANVAS_VARIABLE(canvasvar_MeterBridgePeakindicatorOnFillStart, "meterbridge peakindicator on: fill start")
+CANVAS_VARIABLE(canvasvar_MeterBridgePeakindicatorOnFillEnd, "meterbridge peakindicator on: fill end")
+CANVAS_VARIABLE(canvasvar_MeterBridgeLabelFillStart, "meterbridge label: fill start")
+CANVAS_VARIABLE(canvasvar_MeterBridgeLabelFillEnd, "meterbridge label: fill end")
+CANVAS_VARIABLE(canvasvar_MeterBridgeLabelText, "meterbridge label: text")
 CANVAS_VARIABLE(canvasvar_MeterMarker, "meter marker")
 CANVAS_VARIABLE(canvasvar_MidiBusBase, "midi bus base")
 CANVAS_VARIABLE(canvasvar_MidiFrameBase, "midi frame base")
diff --git a/gtk2_ardour/cocoacarbon.mm b/gtk2_ardour/cocoacarbon.mm
index 072008e..76b92cb 100644
--- a/gtk2_ardour/cocoacarbon.mm
+++ b/gtk2_ardour/cocoacarbon.mm
@@ -112,7 +112,7 @@ set_language_preference ()
 				break;
 			}
 		}
-		NSRange r = { 0, count };
+		NSRange r = { 0, static_cast<NSUInteger> (count) };
 		setenv ("LANGUAGE", [[[languages subarrayWithRange:r] componentsJoinedByString:@":"] UTF8String], 0);
 		cout << "LANGUAGE set to " << getenv ("LANGUAGE") << endl;
 	}
diff --git a/gtk2_ardour/configinfo.cc b/gtk2_ardour/configinfo.cc
index 29c7e8f..67f13a1 100644
--- a/gtk2_ardour/configinfo.cc
+++ b/gtk2_ardour/configinfo.cc
@@ -31,9 +31,15 @@ ConfigInfoDialog::ConfigInfoDialog ()
 	text.get_buffer()->set_text (std::string (ARDOUR::ardour_config_info));
 	text.set_wrap_mode (Gtk::WRAP_WORD);
 	text.show ();
-	text.set_size_request (300, 800);
 
-	get_vbox()->pack_start (text, true, true);
+	scroller.set_shadow_type(Gtk::SHADOW_NONE);
+	scroller.set_border_width(0);
+	scroller.add (text);
+	scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+	scroller.show();
+
+	get_vbox()->pack_start (scroller, true, true);
+	set_size_request (400, 600);
 
 	add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_ACCEPT);
 }
diff --git a/gtk2_ardour/configinfo.h b/gtk2_ardour/configinfo.h
index 84f90b2..209392a 100644
--- a/gtk2_ardour/configinfo.h
+++ b/gtk2_ardour/configinfo.h
@@ -18,6 +18,7 @@
 */
 
 #include <gtkmm/textview.h>
+#include <gtkmm/scrolledwindow.h>
 
 #include "ardour_dialog.h"
 
@@ -28,4 +29,5 @@ class ConfigInfoDialog : public ArdourDialog
 
   private:
 	Gtk::TextView text;
+	Gtk::ScrolledWindow scroller;
 };
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 761404b..300e317 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -697,7 +697,7 @@ Editor::Editor ()
 	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().ShiftReleased.connect (sigc::mem_fun (*this, &Editor::shift_key_released));
+	Gtkmm2ext::Keyboard::the_keyboard().ZoomVerticalModifierReleased.connect (sigc::mem_fun (*this, &Editor::zoom_vertical_modifier_released));
 	
 	/* allow external control surfaces/protocols to do various things */
 
@@ -3125,12 +3125,12 @@ Editor::convert_drop_to_paths (
 		*/
 
 		string txt = data.get_text();
-		const char* p;
+		char* p;
 		const char* q;
 
-		p = (const char *) malloc (txt.length() + 1);
-		txt.copy (const_cast<char *> (p), txt.length(), 0);
-		const_cast<char*>(p)[txt.length()] = '\0';
+		p = (char *) malloc (txt.length() + 1);
+		txt.copy (p, txt.length(), 0);
+		p[txt.length()] = '\0';
 
 		while (p)
 		{
@@ -5499,7 +5499,7 @@ Editor::popup_control_point_context_menu (ArdourCanvas::Item* item, GdkEvent* ev
 }
 
 void
-Editor::shift_key_released ()
+Editor::zoom_vertical_modifier_released()
 {
 	_stepping_axis_view = 0;
 }
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 13c2eeb..033888c 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -188,14 +188,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void set_internal_edit (bool yn);
 	bool toggle_internal_editing_from_double_click (GdkEvent*);
 
-#ifdef WITH_CMT
-	void add_imageframe_time_axis(const std::string & track_name, void*) ;
-	void add_imageframe_marker_time_axis(const std::string & track_name, TimeAxisView* marked_track, void*) ;
-	void connect_to_image_compositor() ;
-	void scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item) ;
-	TimeAxisView* get_named_time_axis(const std::string & name) ;
-#endif /* WITH_CMT */
-
 	void foreach_time_axis_view (sigc::slot<void,TimeAxisView&>);
 	void add_to_idle_resize (TimeAxisView*, int32_t);
 
@@ -1257,13 +1249,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	bool  idle_drop_paths  (std::vector<std::string> paths, framepos_t frame, double ypos, bool copy);
 	void  drop_paths_part_two  (const std::vector<std::string>& paths, framepos_t frame, double ypos, bool copy);
 
-	int  import_sndfiles (std::vector<std::string> paths, Editing::ImportMode mode,  ARDOUR::SrcQuality, framepos_t& pos,
+        int  import_sndfiles (std::vector<std::string> paths, Editing::ImportDisposition, Editing::ImportMode mode,  
+			      ARDOUR::SrcQuality, framepos_t& pos,
 			      int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&, bool);
-	int  embed_sndfiles (std::vector<std::string> paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode,
+	int  embed_sndfiles (std::vector<std::string> paths, bool multiple_files, bool& check_sample_rate, 
+			     Editing::ImportDisposition disposition, Editing::ImportMode mode,
 			     framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&);
 
-	int add_sources (std::vector<std::string> paths, ARDOUR::SourceList& sources, framepos_t& pos, Editing::ImportMode,
+	int add_sources (std::vector<std::string> paths, ARDOUR::SourceList& sources, framepos_t& pos, 
+			 Editing::ImportDisposition, Editing::ImportMode,
 			 int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&, bool add_channel_suffix);
+
 	int finish_bringing_in_material (boost::shared_ptr<ARDOUR::Region> region, uint32_t, uint32_t,  framepos_t& pos, Editing::ImportMode mode,
 				      boost::shared_ptr<ARDOUR::Track>& existing_track);
 
@@ -1454,15 +1450,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void queue_visual_videotimeline_update ();
 	void embed_audio_from_video (std::string, framepos_t n = 0);
 
-	bool canvas_imageframe_item_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
-	bool canvas_imageframe_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameTimeAxis*);
-	bool canvas_imageframe_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
-	bool canvas_imageframe_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
-	bool canvas_marker_time_axis_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerTimeAxis*);
-	bool canvas_markerview_item_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
-	bool canvas_markerview_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
-	bool canvas_markerview_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
-
 	PBD::Signal0<void> EditorFreeze;
 	PBD::Signal0<void> EditorThaw;
 
@@ -1912,47 +1899,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	void nudge_track (bool use_edit_point, bool forwards);
 
-#ifdef WITH_CMT
-	void handle_new_imageframe_time_axis_view(const std::string & track_name, void* src) ;
-	void handle_new_imageframe_marker_time_axis_view(const std::string & track_name, TimeAxisView* marked_track) ;
-
-	void start_imageframe_grab(ArdourCanvas::Item*, GdkEvent*) ;
-	void start_markerview_grab(ArdourCanvas::Item*, GdkEvent*) ;
-
-	void imageframe_drag_motion_callback(ArdourCanvas::Item*, GdkEvent*) ;
-	void markerview_drag_motion_callback(ArdourCanvas::Item*, GdkEvent*) ;
-	void timeaxis_item_drag_finished_callback(ArdourCanvas::Item*, GdkEvent*) ;
-
-	gint canvas_imageframe_item_view_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
-	gint canvas_imageframe_view_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameTimeAxis* ifta);
-	gint canvas_imageframe_start_handle_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
-	gint canvas_imageframe_end_handle_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
-
-	gint canvas_marker_time_axis_view_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerTimeAxis* mta);
-	gint canvas_markerview_item_view_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
-	gint canvas_markerview_start_handle_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
-	gint canvas_markerview_end_handle_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
-
-	void imageframe_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
-	void imageframe_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
-	void imageframe_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
-	void imageframe_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
-	void imageframe_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
-	void imageframe_end_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
-
-	void markerview_item_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
-	void markerview_item_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
-	void markerview_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
-	void markerview_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
-	void markerview_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
-	void markerview_end_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
-
-	void popup_imageframe_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
-	void popup_marker_time_axis_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
-
-	ImageFrameSocketHandler* image_socket_listener ;
-#endif
-
 	static const int32_t default_width = 995;
 	static const int32_t default_height = 765;
 
@@ -2136,15 +2082,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	bool _control_point_toggled_on_press;
 
 	/** This is used by TimeAxisView to keep a track of the TimeAxisView that is currently being
-	    stepped in height using Shift-Scrollwheel.  When a scroll event occurs, we do the step on
-	    this _stepping_axis_view if it is non-0 (and we set up this _stepping_axis_view with the
-	    TimeAxisView underneath the mouse if it is 0).  Then Editor resets _stepping_axis_view when
-	    the shift key is released.  In this (hacky) way, pushing shift and moving the scroll wheel
-	    will operate on the same track until shift is released (rather than skipping about to whatever
-	    happens to be underneath the mouse at the time).
+	    stepped in height using ScrollZoomVerticalModifier+Scrollwheel.  When a scroll event
+	    occurs, we do the step on this _stepping_axis_view if it is non-0 (and we set up this
+	    _stepping_axis_view with the TimeAxisView underneath the mouse if it is 0).  Then Editor
+	    resets _stepping_axis_view when the modifier key is released.  In this (hacky) way,
+	    pushing the modifier key and moving the scroll wheel will operate on the same track
+	    until the key is released (rather than skipping about to whatever happens to be
+	    underneath the mouse at the time).
 	*/
 	TimeAxisView* _stepping_axis_view;
-	void shift_key_released ();
+	void zoom_vertical_modifier_released();
 
 	friend class Drag;
 	friend class RegionDrag;
diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc
index d35e287..a5e2e8a 100644
--- a/gtk2_ardour/editor_actions.cc
+++ b/gtk2_ardour/editor_actions.cc
@@ -551,7 +551,7 @@ Editor::register_actions ()
 
 	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"), _("Framenumber"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 3)));
+	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)));
diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc
index 31ccdb7..3cb2d37 100644
--- a/gtk2_ardour/editor_audio_import.cc
+++ b/gtk2_ardour/editor_audio_import.cc
@@ -264,7 +264,7 @@ Editor::get_nth_selected_midi_track (int nth) const
 }
 
 void
-Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode, SrcQuality quality, framepos_t& pos)
+Editor::do_import (vector<string> paths, ImportDisposition disposition, ImportMode mode, SrcQuality quality, framepos_t& pos)
 {
 	boost::shared_ptr<Track> track;
 	vector<string> to_import;
@@ -280,7 +280,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
 
 	bool ok = true;
 
-	if (chns == Editing::ImportMergeFiles) {
+	if (disposition == Editing::ImportMergeFiles) {
 
 		/* create 1 region from all paths, add to 1 track,
 		   ignore "track"
@@ -299,7 +299,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
 			ok = false;
 		} else {
 			ipw.show ();
-			ok = (import_sndfiles (paths, mode, quality, pos, 1, 1, track, false) == 0);
+			ok = (import_sndfiles (paths, disposition, mode, quality, pos, 1, 1, track, false) == 0);
 		}
 
 	} else {
@@ -334,7 +334,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
 
 			ipw.show ();
 
-			switch (chns) {
+			switch (disposition) {
 			case Editing::ImportDistinctFiles:
 
 				to_import.clear ();
@@ -344,7 +344,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
 					track = get_nth_selected_audio_track (nth++);
 				}
 
-				ok = (import_sndfiles (to_import, mode, quality, pos, 1, -1, track, replace) == 0);
+				ok = (import_sndfiles (to_import, disposition, mode, quality, pos, 1, -1, track, replace) == 0);
 				break;
 
 			case Editing::ImportDistinctChannels:
@@ -352,7 +352,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
 				to_import.clear ();
 				to_import.push_back (*a);
 
-				ok = (import_sndfiles (to_import, mode, quality, pos, -1, -1, track, replace) == 0);
+				ok = (import_sndfiles (to_import, disposition, mode, quality, pos, -1, -1, track, replace) == 0);
 				break;
 
 			case Editing::ImportSerializeFiles:
@@ -360,7 +360,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
 				to_import.clear ();
 				to_import.push_back (*a);
 
-				ok = (import_sndfiles (to_import, mode, quality, pos, 1, 1, track, replace) == 0);
+				ok = (import_sndfiles (to_import, disposition, mode, quality, pos, 1, 1, track, replace) == 0);
 				break;
 
 			case Editing::ImportMergeFiles:
@@ -378,7 +378,7 @@ Editor::do_import (vector<string> paths, ImportDisposition chns, ImportMode mode
 }
 
 void
-Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode, framepos_t& pos)
+Editor::do_embed (vector<string> paths, ImportDisposition import_as, ImportMode mode, framepos_t& pos)
 {
 	boost::shared_ptr<Track> track;
 	bool check_sample_rate = true;
@@ -388,7 +388,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
 	int nth = 0;
 	bool use_timestamp = (pos == -1);
 
-	switch (chns) {
+	switch (import_as) {
 	case Editing::ImportDistinctFiles:
 		for (vector<string>::iterator a = paths.begin(); a != paths.end(); ++a) {
 
@@ -404,7 +404,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
 				track = get_nth_selected_audio_track (nth++);
 			}
 
-			if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, 1, -1, track) < -1) {
+			if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, -1, track) < -1) {
 				goto out;
 			}
 		}
@@ -421,14 +421,14 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
 			to_embed.clear ();
 			to_embed.push_back (*a);
 
-			if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, -1, -1, track) < -1) {
+			if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, -1, -1, track) < -1) {
 				goto out;
 			}
 		}
 		break;
 
 	case Editing::ImportMergeFiles:
-		if (embed_sndfiles (paths, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) {
+		if (embed_sndfiles (paths, multi, check_sample_rate, import_as, mode, pos, 1, 1, track) < -1) {
 			goto out;
 		}
 		break;
@@ -444,7 +444,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
 			to_embed.clear ();
 			to_embed.push_back (*a);
 
-			if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) {
+			if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, 1, track) < -1) {
 				goto out;
 			}
 		}
@@ -460,7 +460,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition chns, ImportMode mode,
 }
 
 int
-Editor::import_sndfiles (vector<string> paths, ImportMode mode, SrcQuality quality, framepos_t& pos,
+Editor::import_sndfiles (vector<string> paths, ImportDisposition disposition, ImportMode mode, SrcQuality quality, framepos_t& pos,
 			 int target_regions, int target_tracks, boost::shared_ptr<Track>& track, bool replace)
 {
 	import_status.paths = paths;
@@ -501,6 +501,7 @@ Editor::import_sndfiles (vector<string> paths, ImportMode mode, SrcQuality quali
 			import_status.paths,
 			import_status.sources,
 			import_status.pos,
+			disposition,
 			import_status.mode,
 			import_status.target_regions,
 			import_status.target_tracks,
@@ -518,7 +519,8 @@ Editor::import_sndfiles (vector<string> paths, ImportMode mode, SrcQuality quali
 
 int
 Editor::embed_sndfiles (vector<string> paths, bool multifile,
-			bool& check_sample_rate, ImportMode mode, framepos_t& pos, int target_regions, int target_tracks,
+			bool& check_sample_rate, ImportDisposition disposition, ImportMode mode, 
+			framepos_t& pos, int target_regions, int target_tracks,
 			boost::shared_ptr<Track>& track)
 {
 	boost::shared_ptr<AudioFileSource> source;
@@ -603,6 +605,7 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile,
 		set_canvas_cursor (_cursors->wait);
 
 		for (int n = 0; n < finfo.channels; ++n) {
+
 			try {
 
 				/* check if we have this thing embedded already */
@@ -613,7 +616,7 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile,
 
 					source = boost::dynamic_pointer_cast<AudioFileSource> (
 						SourceFactory::createExternal (DataType::AUDIO, *_session,
-									       path, n,
+									       path, n, 
 									       (mode == ImportAsTapeTrack
 										? Source::Destructive
 										: Source::Flag (0)),
@@ -638,7 +641,8 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile,
 		goto out;
 	}
 
-	ret = add_sources (paths, sources, pos, mode, target_regions, target_tracks, track, true);
+
+	ret = add_sources (paths, sources, pos, disposition, mode, target_regions, target_tracks, track, true);
 
   out:
 	set_canvas_cursor (current_canvas_cursor);
@@ -646,7 +650,7 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile,
 }
 
 int
-Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos, ImportMode mode,
+Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos, ImportDisposition disposition, ImportMode mode,
 		     int target_regions, int target_tracks, boost::shared_ptr<Track>& track, bool /*add_channel_suffix*/)
 {
 	vector<boost::shared_ptr<Region> > regions;
@@ -654,7 +658,7 @@ Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos,
 	uint32_t input_chan = 0;
 	uint32_t output_chan = 0;
 	bool use_timestamp;
-
+	
 	use_timestamp = (pos == -1);
 
 	// kludge (for MIDI we're abusing "channel" for "track" here)
@@ -707,10 +711,43 @@ Editor::add_sources (vector<string> paths, SourceList& sources, framepos_t& pos,
 
 			boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (*x);
 
-			if (fs) {
-				region_name = region_name_from_path (fs->path(), false, false, sources.size(), n);
-			} else{
-				region_name = (*x)->name();
+			if (sources.size() > 1 && disposition == ImportDistinctChannels) {
+
+				/* generate a per-channel region name so that things work as
+				 * intended
+				 */
+				
+				string path;
+
+				if (fs) {
+					region_name = basename_nosuffix (fs->path());
+				} else {
+					region_name = (*x)->name();
+				}
+				
+				switch (sources.size()) {
+					/* zero and one channel handled
+					   by previous if() condition
+					*/
+				case 2:
+					if (n == 0) {
+						region_name += "-L";
+					} else {
+						region_name += "-R";
+					}
+					break;
+				default:
+					region_name += (char) '-';
+					region_name += (char) ('1' + n);
+					break;
+				}
+				
+			} else {
+				if (fs) {
+					region_name = region_name_from_path (fs->path(), false, false, sources.size(), n);
+				} else{
+					region_name = (*x)->name();
+				}
 			}
 
 			PropertyList plist;
diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc
index c4b07eb..1a6dc86 100644
--- a/gtk2_ardour/editor_canvas.cc
+++ b/gtk2_ardour/editor_canvas.cc
@@ -37,11 +37,9 @@
 #include "waveview.h"
 #include "simplerect.h"
 #include "simpleline.h"
-#include "imageframe.h"
 #include "waveview_p.h"
 #include "simplerect_p.h"
 #include "simpleline_p.h"
-#include "imageframe_p.h"
 #include "canvas_impl.h"
 #include "canvas-noevent-text.h"
 #include "editing.h"
@@ -89,14 +87,12 @@ static void ardour_canvas_type_init()
 	Glib::wrap_register(gnome_canvas_simpleline_get_type(), &Gnome::Canvas::SimpleLine_Class::wrap_new);
 	Glib::wrap_register(gnome_canvas_simplerect_get_type(), &Gnome::Canvas::SimpleRect_Class::wrap_new);
 	Glib::wrap_register(gnome_canvas_waveview_get_type(), &Gnome::Canvas::WaveView_Class::wrap_new);
-	// Glib::wrap_register(gnome_canvas_imageframe_get_type(), &Gnome::Canvas::ImageFrame_Class::wrap_new);
 
 	// Register the gtkmm gtypes:
 
 	(void) Gnome::Canvas::WaveView::get_type();
 	(void) Gnome::Canvas::SimpleLine::get_type();
 	(void) Gnome::Canvas::SimpleRect::get_type();
-	(void) Gnome::Canvas::ImageFrame::get_type();
 }
 
 void
diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc
index fd44ed3..79cc1e0 100644
--- a/gtk2_ardour/editor_canvas_events.cc
+++ b/gtk2_ardour/editor_canvas_events.cc
@@ -66,17 +66,17 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
   retry:
 	switch (direction) {
 	case GDK_SCROLL_UP:
-		if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
+		if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomHorizontalModifier)) {
 			//for mouse-wheel zoom, force zoom-focus to mouse
 			Editing::ZoomFocus temp_focus = zoom_focus;
 			zoom_focus = Editing::ZoomFocusMouse;
 			temporal_zoom_step (false);
 			zoom_focus = temp_focus;
 			return true;
-		} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
+		} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollHorizontalModifier)) {
 			direction = GDK_SCROLL_LEFT;
 			goto retry;
-		} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
+		} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
 			if (!current_stepping_trackview) {
 				step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
 				std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
@@ -95,17 +95,17 @@ Editor::track_canvas_scroll (GdkEventScroll* ev)
 		break;
 
 	case GDK_SCROLL_DOWN:
-		if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
+		if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomHorizontalModifier)) {
 			//for mouse-wheel zoom, force zoom-focus to mouse
 			Editing::ZoomFocus temp_focus = zoom_focus;
 			zoom_focus = Editing::ZoomFocusMouse;
 			temporal_zoom_step (true);
 			zoom_focus = temp_focus;
 			return true;
-		} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
+		} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollHorizontalModifier)) {
 			direction = GDK_SCROLL_RIGHT;
 			goto retry;
-		} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
+		} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
 			if (!current_stepping_trackview) {
 				step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
 				std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index 8f99226..b083e85 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -1665,7 +1665,7 @@ VideoTimeLineDrag::motion (GdkEvent* event, bool first_move)
 	}
 
 	framecnt_t dt = adjusted_current_frame (event) - raw_grab_frame() + _pointer_frame_offset;
-	dt = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(dt);
+	dt = ARDOUR_UI::instance()->video_timeline->quantify_frames_to_apv(_startdrag_video_offset+dt) - _startdrag_video_offset;
 
 	if (_max_backwards_drag >= 0 && dt <= - _max_backwards_drag) {
 		dt = - _max_backwards_drag;
@@ -2373,6 +2373,7 @@ CursorDrag::fake_locate (framepos_t t)
 		framepos_t const f = _editor->playhead_cursor->current_frame;
 		s->send_mmc_locate (f);
 		s->send_full_time_code (f);
+		s->send_song_position_pointer (f);
 	}
 
 	show_verbose_cursor_time (t);
diff --git a/gtk2_ardour/editor_items.h b/gtk2_ardour/editor_items.h
index 303bddb..fb19956 100644
--- a/gtk2_ardour/editor_items.h
+++ b/gtk2_ardour/editor_items.h
@@ -53,18 +53,6 @@ enum ItemType {
         RightFrameHandle,
 	StartCrossFadeItem,
 	EndCrossFadeItem,
-
-#ifdef WITH_CMT
-	MarkerViewItem,
-	MarkerTimeAxisItem,
-	MarkerViewHandleStartItem,
-	MarkerViewHandleEndItem,
-	ImageFrameItem,
-	ImageFrameTimeAxisItem,
-	ImageFrameHandleStartItem,
-	ImageFrameHandleEndItem,
-#endif
-
 	CrossfadeViewItem,
 
 	/* don't remove this */
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index b70d0f0..93a53dd 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -6950,7 +6950,7 @@ Editor::uncombine_regions ()
 void
 Editor::toggle_midi_input_active (bool flip_others)
 {
-	bool onoff;
+	bool onoff = false;
 	boost::shared_ptr<RouteList> rl (new RouteList);
 
 	for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
diff --git a/gtk2_ardour/editor_summary.cc b/gtk2_ardour/editor_summary.cc
index 4e148e2..0dc728d 100644
--- a/gtk2_ardour/editor_summary.cc
+++ b/gtk2_ardour/editor_summary.cc
@@ -623,45 +623,55 @@ EditorSummary::on_scroll_event (GdkEventScroll* ev)
 	double x = xr.first;
 	double y = yr.first;
 
-	double amount = 8;
-
-	if (Keyboard::modifier_state_contains (ev->state, Keyboard::SecondaryModifier)) {
-		amount = 64;
-	} else if (Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier)) {
-		amount = 1;
-	}
-
-	if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
-
-		/* secondary-wheel == left-right scrolling */
-
-		if (ev->direction == GDK_SCROLL_UP) {
-			x -= amount;
-		} else if (ev->direction == GDK_SCROLL_DOWN) {
-			x += amount;
-		}
-
-	} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
-
-		/* primary-wheel == zoom */
-		
-		if (ev->direction == GDK_SCROLL_UP) {
-			_editor->temporal_zoom_step (false);
-		} else {
-			_editor->temporal_zoom_step (true);
-		}
-
-	} else {
-
-		if (ev->direction == GDK_SCROLL_DOWN) {
-			y += amount;
-		} else if (ev->direction == GDK_SCROLL_UP) {
-			y -= amount;
-		} else if (ev->direction == GDK_SCROLL_LEFT) {
-			x -= amount;
-		} else if (ev->direction == GDK_SCROLL_RIGHT) {
-			x += amount;
-		}
+	switch (ev->direction) {
+		case GDK_SCROLL_UP:
+			if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollHorizontalModifier)) {
+				x -= 64;
+			} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomHorizontalModifier)) {
+				_editor->temporal_zoom_step (false);
+			} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
+				yr.first  += 4;
+				yr.second -= 4;
+				set_editor (xr, yr);
+				return true;
+			} else {
+				y -= 8;
+			}
+			break;
+		case GDK_SCROLL_DOWN:
+			if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollHorizontalModifier)) {
+				x += 64;
+			} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomHorizontalModifier)) {
+				_editor->temporal_zoom_step (true);
+			} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
+				yr.first  -= 4;
+				yr.second += 4;
+				set_editor (xr, yr);
+				return true;
+			} else {
+				y += 8;
+			}
+			break;
+		case GDK_SCROLL_LEFT:
+			if (Keyboard::modifier_state_contains (ev->state, Keyboard::SecondaryModifier)) {
+				x -= 64;
+			} else if (Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier)) {
+				x -= 1;
+			} else {
+				x -= 8;
+			}
+			break;
+		case GDK_SCROLL_RIGHT:
+			if (Keyboard::modifier_state_contains (ev->state, Keyboard::SecondaryModifier)) {
+				x += 64;
+			} else if (Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier)) {
+				x += 1;
+			} else {
+				x += 8;
+			}
+			break;
+		default:
+			break;
 	}
 
 	set_editor (x, y);
diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc
index fa42211..0a516fb 100644
--- a/gtk2_ardour/editor_videotimeline.cc
+++ b/gtk2_ardour/editor_videotimeline.cc
@@ -36,6 +36,7 @@
 #include "export_video_infobox.h"
 #include "interthread_progress_window.h"
 
+#include "pbd/openuri.h"
 #include "i18n.h"
 
 using namespace std;
@@ -108,7 +109,7 @@ Editor::embed_audio_from_video (std::string path, framepos_t n)
 	ipw.show ();
 
 	boost::shared_ptr<ARDOUR::Track> track;
-	bool ok = (import_sndfiles (paths, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0);
+	bool ok = (import_sndfiles (paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0);
 	if (ok && track) {
 		boost::shared_ptr<ARDOUR::Playlist> pl = track->playlist();
 		pl->find_next_region(n, ARDOUR::End, 0)->set_video_locked(true);
@@ -125,10 +126,17 @@ Editor::export_video ()
 {
 	if (ARDOUR::Config->get_show_video_export_info()) {
 		ExportVideoInfobox infobox (_session);
-		infobox.run();
+		Gtk::ResponseType rv = (Gtk::ResponseType) infobox.run();
 		if (infobox.show_again()) {
 			ARDOUR::Config->set_show_video_export_info(false);
 		}
+		switch (rv) {
+			case GTK_RESPONSE_YES:
+				PBD::open_uri (ARDOUR::Config->get_reference_manual_url() + "/video-timeline/operations/#export");
+				break;
+			default:
+				break;
+		}
 	}
 	ExportVideoDialog dialog (*this, _session);
 	Gtk::ResponseType r = (Gtk::ResponseType) dialog.run();
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc
index a9e04d8..05cd9a6 100644
--- a/gtk2_ardour/engine_dialog.cc
+++ b/gtk2_ardour/engine_dialog.cc
@@ -167,8 +167,12 @@ EngineControl::EngineControl ()
 
 	strings.clear ();
 	strings.push_back (_("None"));
+#ifdef __APPLE__
+	strings.push_back (_("coremidi"));
+#else
 	strings.push_back (_("seq"));
 	strings.push_back (_("raw"));
+#endif
 	set_popdown_strings (midi_driver_combo, strings);
 	midi_driver_combo.set_active_text (strings.front ());
 
@@ -439,6 +443,12 @@ EngineControl::build_command_line (vector<string>& cmd)
 
 	cmd.push_back ("-T"); // temporary */
 
+	/* setup coremidi before the driver, otherwise jack won't start */
+
+	if (midi_driver_combo.get_active_text() == _("coremidi")) {
+		cmd.push_back ("-X coremidi");
+	}
+
 	/* next the driver */
 
 	cmd.push_back ("-d");
diff --git a/gtk2_ardour/export_format_selector.cc b/gtk2_ardour/export_format_selector.cc
index f66d13d..a2ba3f3 100644
--- a/gtk2_ardour/export_format_selector.cc
+++ b/gtk2_ardour/export_format_selector.cc
@@ -43,7 +43,7 @@ ExportFormatSelector::ExportFormatSelector () :
 	new_button.set_name ("PaddedButton");
 
 	edit_button.signal_clicked().connect (sigc::hide_return (sigc::bind (sigc::mem_fun (*this, &ExportFormatSelector::open_edit_dialog), false)));
-	remove_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportFormatSelector::remove_format));
+	remove_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &ExportFormatSelector::remove_format), true));
 	new_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportFormatSelector::add_new_format));
 
 	/* Format combo */
@@ -122,7 +122,7 @@ ExportFormatSelector::add_new_format ()
 	FormatPtr new_format = state->format = NewFormat (state->format);
 
 	if (open_edit_dialog (true) != Gtk::RESPONSE_APPLY) {
-		remove_format();
+		remove_format(false);
 		if (state->list->empty()) {
 			state->format.reset ();
 		}
@@ -130,11 +130,26 @@ ExportFormatSelector::add_new_format ()
 }
 
 void
-ExportFormatSelector::remove_format ()
+ExportFormatSelector::remove_format (bool called_from_button)
 {
+	if (called_from_button) {
+		Gtk::MessageDialog dialog (_("Do you really want to remove the format?"),
+				false,
+				Gtk::MESSAGE_QUESTION,
+				Gtk::BUTTONS_YES_NO);
+
+		if (Gtk::RESPONSE_YES != dialog.run ()) {
+			/* User has selected "no" or closed the dialog, better
+			 * abort
+			 */
+			return;
+		}
+	}
+
 	FormatPtr remove;
 	Gtk::TreeModel::iterator it = format_combo.get_active();
 	remove = it->get_value (format_cols.format);
+
 	FormatRemoved (remove);
 }
 
diff --git a/gtk2_ardour/export_format_selector.h b/gtk2_ardour/export_format_selector.h
index 9533b15..4af647a 100644
--- a/gtk2_ardour/export_format_selector.h
+++ b/gtk2_ardour/export_format_selector.h
@@ -63,7 +63,7 @@ class ExportFormatSelector : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 
 	void select_format (FormatPtr f);
 	void add_new_format ();
-	void remove_format ();
+	void remove_format (bool called_from_button = false);
 	int open_edit_dialog (bool new_dialog = false);
 	void update_format_combo ();
 	void update_format_description ();
diff --git a/gtk2_ardour/export_multiplicator.cc b/gtk2_ardour/export_multiplicator.cc
deleted file mode 100644
index ba5a2a6..0000000
--- a/gtk2_ardour/export_multiplicator.cc
+++ /dev/null
@@ -1,330 +0,0 @@
-/* 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 code in
- * libs/ardour/export_multiplication.cc and libs/ardour/ardour/export_multiplication.h
- * - Sakari Bergen 6.8.2008 -
- */
-
-/*
-    Copyright (C) 2008 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.
-
-*/
-
-#include "export_multiplicator.h"
-
-#include <cassert>
-
-#include "pbd/compose.h"
-
-#include "i18n.h"
-
-using namespace ARDOUR;
-using namespace PBD;
-
-#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
-
-ExportMultiplicator::ExportMultiplicator () :
-  graph (0)
-{
-	add (table);
-}
-
-ExportMultiplicator::~ExportMultiplicator ()
-{}
-
-void
-ExportMultiplicator::set_manager (boost::shared_ptr<ARDOUR::ExportProfileManager> _manager)
-{
-	manager = _manager;
-	manager->GraphChanged.connect (sigc::mem_fun (*this, &ExportMultiplicator::redraw));
-
-	redraw();
-}
-
-void
-ExportMultiplicator::redraw ()
-{
-	if (!manager) { return; }
-
-	graph = &manager->get_graph();
-
-	/* Empty table */
-
-	table.foreach (sigc::mem_fun (table, &Gtk::Table::remove));
-	widget_map.clear();
-
-	/* Calculate table dimensions */
-
-	uint32_t max_width = 0;
-	GraphLevel max_level = NoLevel;
-
-	if (graph->timespans.size() > max_width) {
-		max_width = graph->timespans.size();
-		max_level = Timespans;
-	}
-
-	if (graph->channel_configs.size() > max_width) {
-		max_width = graph->channel_configs.size();
-		max_level = ChannelConfigs;
-	}
-
-	if (graph->formats.size() > max_width) {
-		max_width = graph->formats.size();
-		max_level = Formats;
-	}
-
-	if (graph->filenames.size() > max_width) {
-		max_width = graph->filenames.size();
-		max_level = Filenames;
-	}
-
-	table.resize (4, max_width);
-
-	std::cout << "Table width: " << max_width << std::endl;
-
-	/* Fill table */
-
-	for (list<ExportProfileManager::TimespanNodePtr>::const_iterator it = graph->timespans.begin(); it != graph->timespans.end(); ++it) {
-		draw_timespan (*it, get_bounds (it->get(), Timespans, max_level));
-	}
-
-	for (list<ExportProfileManager::ChannelConfigNodePtr>::const_iterator it = graph->channel_configs.begin(); it != graph->channel_configs.end(); ++it) {
-		draw_channel_config (*it, get_bounds (it->get(), ChannelConfigs, max_level));
-	}
-
-	for (list<ExportProfileManager::FormatNodePtr>::const_iterator it = graph->formats.begin(); it != graph->formats.end(); ++it) {
-		draw_format (*it, get_bounds (it->get(), Formats, max_level));
-	}
-
-	for (list<ExportProfileManager::FilenameNodePtr>::const_iterator it = graph->filenames.begin(); it != graph->filenames.end(); ++it) {
-		draw_filename (*it, get_bounds (it->get(), Filenames, max_level));
-	}
-
-	show_all_children ();
-}
-
-std::pair<uint32_t, uint32_t>
-ExportMultiplicator::get_bounds (ARDOUR::ExportProfileManager::GraphNode * node, GraphLevel current_level, GraphLevel max_level) const
-{
-	assert (current_level != NoLevel && max_level != NoLevel && graph);
-
-	uint32_t left_bound = 0;
-	uint32_t right_bound = 0;
-
-	bool left_bound_found = false;
-
-	bool (ExportProfileManager::GraphNode::*relation_func) (ExportProfileManager::GraphNode const *) const;
-	if (max_level < current_level) {
-		std::cout << "using 'is_ancestor_of'" << std::endl;
-		relation_func = &ExportProfileManager::GraphNode::is_ancestor_of;
-	} else if (max_level > current_level) {
-		std::cout << "using 'is_descendant_of'" << std::endl;
-		relation_func = &ExportProfileManager::GraphNode::is_descendant_of;
-	} else {
-		std::cout << "using 'equals'" << std::endl;
-		relation_func = &ExportProfileManager::GraphNode::equals;
-	}
-
-	switch (max_level) {
-	  case Timespans:
-		for (list<ExportProfileManager::TimespanNodePtr>::const_iterator it = graph->timespans.begin(); it != graph->timespans.end(); ++it) {
-			if (CALL_MEMBER_FN(**it, relation_func) (node)) {
-				left_bound_found = true;
-			} else if (!left_bound_found) {
-				++left_bound;
-			}
-
-			if (left_bound_found && !CALL_MEMBER_FN(**it, relation_func) (node)) {
-				break;
-			} else {
-				++right_bound;
-			}
-		}
-		break;
-
-	  case ChannelConfigs:
-		for (list<ExportProfileManager::ChannelConfigNodePtr>::const_iterator it = graph->channel_configs.begin(); it != graph->channel_configs.end(); ++it) {
-			if (CALL_MEMBER_FN(**it, relation_func) (node)) {
-				left_bound_found = true;
-			} else if (!left_bound_found) {
-				++left_bound;
-			}
-
-			if (left_bound_found && !CALL_MEMBER_FN(**it, relation_func) (node)) {
-				break;
-			} else {
-				++right_bound;
-			}
-		}
-		break;
-
-	  case Formats:
-		for (list<ExportProfileManager::FormatNodePtr>::const_iterator it = graph->formats.begin(); it != graph->formats.end(); ++it) {
-			if (CALL_MEMBER_FN(**it, relation_func) (node)) {
-				left_bound_found = true;
-			} else if (!left_bound_found) {
-				++left_bound;
-			}
-
-			if (left_bound_found && !CALL_MEMBER_FN(**it, relation_func) (node)) {
-				break;
-			} else {
-				++right_bound;
-			}
-		}
-		break;
-
-	  case Filenames:
-		for (list<ExportProfileManager::FilenameNodePtr>::const_iterator it = graph->filenames.begin(); it != graph->filenames.end(); ++it) {
-			if (CALL_MEMBER_FN(**it, relation_func) (node)) {
-				std::cout << "filename relation check returned true" << std::endl;
-				left_bound_found = true;
-			} else if (!left_bound_found) {
-				std::cout << "filename relation check returned false" << std::endl;
-				++left_bound;
-			}
-
-			if (left_bound_found && !CALL_MEMBER_FN(**it, relation_func) (node)) {
-				break;
-			} else {
-				++right_bound;
-			}
-		}
-		break;
-
-	  case NoLevel:
-		// Not reached !
-		break;
-	}
-
-	return std::pair<uint32_t, uint32_t> (left_bound, right_bound);
-}
-
-void
-ExportMultiplicator::draw_timespan (ARDOUR::ExportProfileManager::TimespanNodePtr node, std::pair<uint32_t, uint32_t> bounds)
-{
-	ButtonWidget * button = Gtk::manage (new ButtonWidget (string_compose ("Timespan %1", node->id()), manager, node.get()));
-	get_hbox (TablePosition (bounds.first, bounds.second, Timespans))->pack_end (*button, true, true);
-}
-
-void
-ExportMultiplicator::draw_channel_config (ARDOUR::ExportProfileManager::ChannelConfigNodePtr node, std::pair<uint32_t, uint32_t> bounds)
-{
-	ButtonWidget * button = Gtk::manage (new ButtonWidget (string_compose ("Channel config %1", node->id()), manager, node.get()));
-	get_hbox (TablePosition (bounds.first, bounds.second, ChannelConfigs))->pack_end (*button, true, true);
-}
-
-void
-ExportMultiplicator::draw_format (ARDOUR::ExportProfileManager::FormatNodePtr node, std::pair<uint32_t, uint32_t> bounds)
-{
-	ButtonWidget * button = Gtk::manage (new ButtonWidget (string_compose ("Format %1", node->id()), manager, node.get()));
-	get_hbox (TablePosition (bounds.first, bounds.second, Formats))->pack_end (*button, true, true);
-}
-
-void
-ExportMultiplicator::draw_filename (ARDOUR::ExportProfileManager::FilenameNodePtr node, std::pair<uint32_t, uint32_t> bounds)
-{
-	ButtonWidget * button = Gtk::manage (new ButtonWidget (string_compose ("Filename %1", node->id()), manager, node.get()));
-	get_hbox (TablePosition (bounds.first, bounds.second, Filenames))->pack_end (*button, true, true);
-}
-
-boost::shared_ptr<Gtk::HBox>
-ExportMultiplicator::get_hbox (TablePosition position)
-{
-	WidgetMap::iterator it = widget_map.find (position);
-	if (it != widget_map.end()) { return it->second; }
-
-	boost::shared_ptr<Gtk::HBox> widget = widget_map.insert (WidgetPair (position, boost::shared_ptr<Gtk::HBox> (new Gtk::HBox ()))).first->second;
-	table.attach (*widget, position.left, position.right, position.row - 1, position.row);
-
-	return widget;
-}
-
-ExportMultiplicator::ButtonWidget::ButtonWidget (std::string name, boost::shared_ptr<ExportProfileManager> m, ExportProfileManager::GraphNode * node) :
-  label (name),
-  node (node),
-  split_position (0.5)
-{
-	manager = m;
-
-	menu_actions = Gtk::ActionGroup::create();
-	menu_actions->add (Gtk::Action::create ("Split", _("_Split here")), sigc::mem_fun (*this, &ExportMultiplicator::ButtonWidget::split));
-	menu_actions->add (Gtk::Action::create ("Remove", _("_Remove")), sigc::mem_fun (*this, &ExportMultiplicator::ButtonWidget::remove));
-
-	ui_manager = Gtk::UIManager::create();
-	ui_manager->insert_action_group (menu_actions);
-
-	std::string ui_info =
-		"<ui>"
-		"  <popup name='PopupMenu'>"
-		"    <menuitem action='Split'/>"
-		"    <menuitem action='Remove'/>"
-		"  </popup>"
-		"</ui>";
-
-	ui_manager->add_ui_from_string (ui_info);
-	menu = dynamic_cast<Gtk::Menu*> (ui_manager->get_widget ("/PopupMenu"));
-
-	add_events (Gdk::BUTTON_PRESS_MASK);
-	signal_button_press_event ().connect (sigc::mem_fun (*this, &ExportMultiplicator::ButtonWidget::on_button_press_event));
-
-	modify_bg (Gtk::STATE_NORMAL, Gdk::Color ("#0000"));
-	set_border_width (1);
-	vbox.pack_start (label, true, true, 4);
-	add (vbox);
-}
-
-bool
-ExportMultiplicator::ButtonWidget::on_button_press_event (GdkEventButton* event)
-{
-	if(event->type != GDK_BUTTON_PRESS) { return false; }
-	if (event->button == 1) {
-		node->select (!node->selected ());
-
-		if (node->selected ()) {
-			unset_bg (Gtk::STATE_NORMAL);
-			modify_bg (Gtk::STATE_NORMAL, Gdk::Color ("#194756"));
-		} else {
-			unset_bg (Gtk::STATE_NORMAL);
-			modify_bg (Gtk::STATE_NORMAL, Gdk::Color ("#0000"));
-		}
-
-		return true;
-
-	} else if (event->button == 3) {
-		int x, y;
-		get_pointer (x, y);
-		split_position = (float) x / get_width();
-
-		menu->popup (event->button, event->time);
-		return true;
-	}
-
-	return false;
-}
-
-void
-ExportMultiplicator::ButtonWidget::split ()
-{
-	manager->split_node (node, split_position);
-}
-
-void
-ExportMultiplicator::ButtonWidget::remove ()
-{
-	manager->remove_node (node);
-}
diff --git a/gtk2_ardour/export_multiplicator.h b/gtk2_ardour/export_multiplicator.h
deleted file mode 100644
index 1e204e1..0000000
--- a/gtk2_ardour/export_multiplicator.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* 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 code in
- * libs/ardour/export_multiplication.cc and libs/ardour/ardour/export_multiplication.h
- * - Sakari Bergen 6.8.2008 -
- */
-
-/*
-    Copyright (C) 2008 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.
-
-*/
-
-#ifndef __export_multiplicator_h__
-#define __export_multiplicator_h__
-
-#include <utility>
-#include <map>
-
-#include "ardour/export_profile_manager.h"
-
-#include <gtkmm.h>
-#include <boost/shared_ptr.hpp>
-
-using ARDOUR::ExportProfileManager;
-
-class ExportMultiplicator : public Gtk::EventBox {
-  public:
-
-	ExportMultiplicator ();
-	~ExportMultiplicator ();
-
-	void set_manager (boost::shared_ptr<ExportProfileManager> _manager);
-
-  private:
-
-	boost::shared_ptr<ExportProfileManager>  manager;
-	ExportProfileManager::MultiplicationGraph const * graph;
-
-	/* Drawing stuff */
-
-	Gtk::Table table;
-
-	void redraw ();
-
-	enum GraphLevel {
-		NoLevel = 0,
-		Timespans = 1,
-		ChannelConfigs = 2,
-		Formats = 3,
-		Filenames = 4
-	};
-
-	std::pair<uint32_t, uint32_t> get_bounds (ExportProfileManager::GraphNode * node, GraphLevel current_level, GraphLevel max_level) const;
-
-	void draw_timespan (ExportProfileManager::TimespanNodePtr node, std::pair<uint32_t, uint32_t> bounds);
-	void draw_channel_config (ExportProfileManager::ChannelConfigNodePtr node, std::pair<uint32_t, uint32_t> bounds);
-	void draw_format (ExportProfileManager::FormatNodePtr node, std::pair<uint32_t, uint32_t> bounds);
-	void draw_filename (ExportProfileManager::FilenameNodePtr node, std::pair<uint32_t, uint32_t> bounds);
-
-	struct TablePosition {
-		uint32_t left;
-		uint32_t right;
-		uint32_t row;
-
-		TablePosition (uint32_t left, uint32_t right, uint32_t row) :
-		  left (left), right (right), row (row) {}
-
-		bool operator== (TablePosition const & other) const { return (row == other.row && left == other.left && right == other.right); }
-		bool operator< (TablePosition const & other) const { return (row < other.row || left < other.left || right < other.right); }
-	};
-
-	typedef std::map<TablePosition, boost::shared_ptr<Gtk::HBox> > WidgetMap;
-	typedef std::pair<TablePosition, boost::shared_ptr<Gtk::HBox> > WidgetPair;
-
-	boost::shared_ptr<Gtk::HBox> get_hbox (TablePosition position);
-	WidgetMap widget_map;
-
-	/* Button Widget */
-
-	class ButtonWidget : public Gtk::EventBox {
-	  public:
-		ButtonWidget (std::string name, boost::shared_ptr<ExportProfileManager> m, ExportProfileManager::GraphNode * node);
-
-	  private:
-
-		Gtk::Label label;
-		Gtk::VBox  vbox;
-
-		bool on_button_press_event (GdkEventButton* event);
-
-		void split ();
-		void remove ();
-
-		boost::shared_ptr<ExportProfileManager> manager;
-		ExportProfileManager::GraphNode * node;
-		float split_position;
-
-		/* Context menu */
-
-		Glib::RefPtr<Gtk::ActionGroup> menu_actions;
-		Glib::RefPtr<Gtk::UIManager>   ui_manager;
-		Gtk::Menu *                    menu;
-	};
-};
-
-#endif /* __export_multiplicator_h__ */
diff --git a/gtk2_ardour/export_preset_selector.cc b/gtk2_ardour/export_preset_selector.cc
index 3898916..9f699bb 100644
--- a/gtk2_ardour/export_preset_selector.cc
+++ b/gtk2_ardour/export_preset_selector.cc
@@ -153,6 +153,18 @@ ExportPresetSelector::remove_current ()
 {
 	if (!profile_manager) { return; }
 
+	Gtk::MessageDialog dialog (_("Do you really want to remove this preset?"),
+			false,
+			Gtk::MESSAGE_QUESTION,
+			Gtk::BUTTONS_YES_NO);
+
+	if (Gtk::RESPONSE_YES != dialog.run ()) {
+		/* User has selected "no" or closed the dialog, better
+		 * abort
+		 */
+		return;
+	}
+
 	profile_manager->remove_preset();
 	entry.get_entry()->set_text ("");
 	sync_with_manager ();
diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc
index 309e3af..b8f94ac 100644
--- a/gtk2_ardour/export_video_dialog.cc
+++ b/gtk2_ardour/export_video_dialog.cc
@@ -60,6 +60,7 @@ using namespace Gtk;
 using namespace std;
 using namespace PBD;
 using namespace ARDOUR;
+using namespace VideoUtils;
 
 ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s)
 	: ArdourDialog (_("Export Video File "))
@@ -85,7 +86,7 @@ ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s)
 	, fps_checkbox (_("Override FPS (Default is to retain FPS from the input video file):"))
 	, meta_checkbox (_("Include Session Metadata"))
 #if 1 /* tentative debug mode */
-	, debug_checkbox (_("Enable Debug Mode: Print ffmpeg Command & Output to stdout."))
+	, debug_checkbox (_("Debug Mode: Print ffmpeg command and output to stdout."))
 #endif
 {
 	set_session (s);
@@ -141,13 +142,13 @@ ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s)
 	vbox->pack_start (*path_hbox, false, false, 2);
 
 	insnd_combo.set_name ("PaddedButton");
-	insnd_combo.append_text("from ardour session-start to session-end");
+	insnd_combo.append_text (string_compose (_("from the %1 session's start to the session's end"), PROGRAM_NAME));
 
 	frameoffset_t av_offset = ARDOUR_UI::instance()->video_timeline->get_offset();
 	if (av_offset < 0 ) {
-		insnd_combo.append_text("from 00:00:00:00 to video-end");
+		insnd_combo.append_text (_("from 00:00:00:00 to the video's end"));
 	} else {
-		insnd_combo.append_text("from video-start to video-end");
+		insnd_combo.append_text (_("from the video's start to the video's end"));
 	}
 	insnd_combo.set_active(0);
 
@@ -155,12 +156,29 @@ ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s)
 	outfn_path_entry.set_text (_session->session_directory().export_path() + G_DIR_SEPARATOR +"export.avi");
 
 	XMLNode* node = _session->extra_xml (X_("Videotimeline"));
-	if (node && node->property(X_("Filename"))) {
-		std::string filename = node->property(X_("Filename"))->value();
-		if (filename.at(0) != G_DIR_SEPARATOR) {
-			filename = Glib::build_filename (_session->session_directory().video_path(), filename);
+	if (node) {
+		bool filenameset = false;
+		if (node->property(X_("OriginalVideoFile"))) {
+			std::string filename = node->property(X_("OriginalVideoFile"))->value();
+			if (Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) {
+				invid_path_entry.set_text (filename);
+				filenameset = true;
+			}
+		}
+		else if (!filenameset
+				&& node->property(X_("Filename"))
+				&& node->property(X_("LocalFile"))
+				&& node->property(X_("LocalFile"))->value() == X_("1")
+				) {
+			std::string filename = node->property(X_("Filename"))->value();
+			if (filename.at(0) != G_DIR_SEPARATOR) {
+				filename = Glib::build_filename (_session->session_directory().video_path(), filename);
+			}
+			if (Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) {
+				invid_path_entry.set_text (filename);
+				filenameset = true;
+			}
 		}
-		invid_path_entry.set_text (filename);
 	}
 
 	l = manage (new Label (_("<b>Settings:</b>"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
@@ -416,7 +434,7 @@ ExportVideoDialog::launch_export ()
 	cancel_button->hide();
 	transcode_button.hide();
 	pbar.set_size_request(300,-1);
-	pbar.set_text(_("Exporting Audio.."));
+	pbar.set_text(_("Exporting Audio..."));
 	progress_box->show();
 	aborted = false;
 	twopass = twopass_checkbox.get_active();
@@ -541,7 +559,7 @@ ExportVideoDialog::launch_export ()
 		Gtk::Dialog::response(RESPONSE_CANCEL);
 		return;
 	}
-	pbar.set_text (_("Encoding Video.."));
+	pbar.set_text (_("Encoding Video..."));
 	encode_pass(1);
 }
 
@@ -567,7 +585,7 @@ ExportVideoDialog::encode_pass (int pass)
 	}
 
 	std::string preset = preset_combo.get_active_text();
-	FFSettings ffs ; /* = transcoder->default_encoder_settings(); */
+	TranscodeFfmpeg::FFSettings ffs ; /* = transcoder->default_encoder_settings(); */
 	ffs.clear();
 
 	if (fps_checkbox.get_active()) {
@@ -581,7 +599,7 @@ ExportVideoDialog::encode_pass (int pass)
 	ffs["-acodec"] = audio_codec_combo.get_active_text();
 
 	if (video_bitrate_combo.get_active_text() == "retain" ) {
-		ffs["-sameq"]  = "-y"; // we use '-y' as dummy parameter for non key/value options
+		ffs["-qscale"]  = "0";
 	} else {
 		ffs["-b:v"]  = video_bitrate_combo.get_active_text();
 	}
@@ -723,7 +741,7 @@ ExportVideoDialog::encode_pass (int pass)
 		transcoder->set_avoffset(av_offset / (double)_session->nominal_frame_rate());
 	}
 
-	FFSettings meta = transcoder->default_meta_data();
+	TranscodeFfmpeg::FFSettings meta = transcoder->default_meta_data();
 	if (meta_checkbox.get_active()) {
 		ARDOUR::SessionMetadata * session_data = ARDOUR::SessionMetadata::Metadata();
 		if (session_data->year() > 0 ) {
diff --git a/gtk2_ardour/export_video_infobox.cc b/gtk2_ardour/export_video_infobox.cc
index 9218046..fbe28bd 100644
--- a/gtk2_ardour/export_video_infobox.cc
+++ b/gtk2_ardour/export_video_infobox.cc
@@ -43,7 +43,11 @@ ExportVideoInfobox::ExportVideoInfobox (Session* s)
 	l = manage (new Label (_("<b>Video Export Info</b>"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
 	l->set_use_markup ();
 	vbox->pack_start (*l, false, true);
-	l = manage (new Label (_("Ardour video export is not recommended for mastering!\nWhile 'ffmpeg' (which is used by ardour) can produce high-quality files, this export lacks the possibility to tweak many settings. We recommend to use 'winff', 'devede' or 'dvdauthor' to mux & master. Nevertheless this video-export comes in handy to do quick snapshots, intermediates, dailies or online videos.\n\nThe soundtrack is created from the master-bus of the current Ardour session.\n\nThe video soure defaults to the file used in the video timeline, which may not the best quality to start with, you should the original video file.\n\nIf the export-range is longer than the original video, black video frames are prefixed and/or appended. This process may fail with non-standard pixel-aspect-ratios.\n\nThe file-format is determined by the extension that you choose for the output file (.avi, .mov, .flv, .ogv,...)\nNote: not all combinations of format+codec+settings produce files which are according so spec. e.g. flv files require sample-rates of 22.1kHz or 44.1kHz, mpeg containers can not be used with ac3 audio-codec, etc. If in doubt, use one of the built-in presets."), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
+	l = manage (new Label (
+				string_compose(
+				_("Video encoding is a non-trivial task with many details.\n\nPlease see the manual at %1/video-timeline/operations/#export.\n\nOpen Manual in Browser? "),
+				Config->get_reference_manual_url()
+				), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
 	l->set_size_request(700,-1);
 	l->set_line_wrap();
 	vbox->pack_start (*l, false, true,4);
@@ -56,7 +60,8 @@ ExportVideoInfobox::ExportVideoInfobox (Session* s)
 
 	showagain_checkbox.set_active(false);
 	show_all_children ();
-	add_button (Stock::OK, RESPONSE_ACCEPT);
+	add_button (Stock::YES, RESPONSE_YES);
+	add_button (Stock::NO, RESPONSE_NO);
 }
 
 ExportVideoInfobox::~ExportVideoInfobox ()
diff --git a/gtk2_ardour/export_video_infobox.h b/gtk2_ardour/export_video_infobox.h
index 6bd6c64..d3dadf1 100644
--- a/gtk2_ardour/export_video_infobox.h
+++ b/gtk2_ardour/export_video_infobox.h
@@ -38,7 +38,6 @@ class ExportVideoInfobox : public ArdourDialog
 	bool show_again () { return showagain_checkbox.get_active(); }
 
   private:
-	//void on_show ();
 	Gtk::CheckButton showagain_checkbox;
 };
 
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc
index 8a8d54d..67f9ce9 100644
--- a/gtk2_ardour/gain_meter.cc
+++ b/gtk2_ardour/gain_meter.cc
@@ -44,10 +44,13 @@
 #include "keyboard.h"
 #include "public_editor.h"
 #include "utils.h"
+#include "meter_patterns.h"
 
 #include "ardour/session.h"
 #include "ardour/route.h"
 #include "ardour/meter.h"
+#include "ardour/audio_track.h"
+#include "ardour/midi_track.h"
 
 #include "i18n.h"
 
@@ -57,18 +60,12 @@ using namespace Gtkmm2ext;
 using namespace Gtk;
 using namespace std;
 using Gtkmm2ext::Keyboard;
-
-sigc::signal<void> GainMeterBase::ResetAllPeakDisplays;
-sigc::signal<void,RouteGroup*> GainMeterBase::ResetGroupPeakDisplays;
-
-GainMeter::MetricPatterns GainMeter::metric_patterns;
+using namespace ArdourMeter;
 
 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()), 0.0, 1.0, 0.01, 0.1)
 	, gain_automation_style_button ("")
 	, gain_automation_state_button ("")
-	, style_changed (false)
-	, dpi_changed (false)
 	, _data_type (DataType::AUDIO)
 
 {
@@ -87,7 +84,7 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
 		gain_slider = manage (new VSliderController (&gain_adjustment, fader_length, fader_girth, false));
 	}
 
-	level_meter = new LevelMeter(_session);
+	level_meter = new LevelMeterHBox(_session);
 
 	level_meter->ButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&GainMeterBase::level_meter_button_press, this, _1));
 	meter_metric_area.signal_button_press_event().connect (sigc::mem_fun (*this, &GainMeterBase::level_meter_button_press));
@@ -132,7 +129,9 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
 	gain_display.signal_key_press_event().connect (sigc::mem_fun(*this, &GainMeterBase::gain_key_press), false);
 
 	ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &GainMeterBase::reset_peak_display));
+	ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &GainMeterBase::reset_route_peak_display));
 	ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &GainMeterBase::reset_group_peak_display));
+	RedrawMetrics.connect (sigc::mem_fun(*this, &GainMeterBase::redraw_metrics));
 
 	UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &GainMeterBase::on_theme_changed));
 	ColorsChanged.connect (sigc::bind(sigc::mem_fun (*this, &GainMeterBase::color_handler), false));
@@ -269,33 +268,57 @@ GainMeterBase::hide_all_meters ()
 void
 GainMeter::hide_all_meters ()
 {
-	bool remove_metric_area = false;
-
 	GainMeterBase::hide_all_meters ();
+}
 
-	if (remove_metric_area) {
-		if (meter_metric_area.get_parent()) {
-			level_meter->remove (meter_metric_area);
-		}
+void
+GainMeterBase::setup_meters (int len)
+{
+	int meter_width = 5;
+
+	switch (_width) {
+		case Wide:
+			meter_ticks1_area.show();
+			meter_ticks2_area.show();
+			if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) {
+				meter_width = 10;
+			}
+			break;
+		case Narrow:
+			meter_width = 2;
+			meter_ticks1_area.hide();
+			meter_ticks2_area.hide();
+			break;
 	}
+	level_meter->setup_meters(len, meter_width);
 }
 
 void
-GainMeterBase::setup_meters (int len)
+GainMeterBase::set_type (MeterType t)
 {
-	level_meter->setup_meters(len, 5);
+	level_meter->set_type(t);
 }
 
 void
 GainMeter::setup_meters (int len)
 {
-	if (!meter_metric_area.get_parent()) {
-		level_meter->pack_end (meter_metric_area, false, false);
-		meter_metric_area.show_all ();
+	switch (_width) {
+		case Wide:
+			hbox.set_homogeneous(true);
+			break;
+		case Narrow:
+			hbox.set_homogeneous(false);
+			break;
 	}
 	GainMeterBase::setup_meters (len);
 }
 
+void
+GainMeter::set_type (MeterType t)
+{
+	GainMeterBase::set_type (t);
+}
+
 bool
 GainMeterBase::gain_key_press (GdkEventKey* ev)
 {
@@ -319,7 +342,7 @@ GainMeterBase::peak_button_release (GdkEventButton* ev)
 			ResetGroupPeakDisplays (_route->route_group());
 		}
 	} else {
-		reset_peak_display ();
+		ResetRoutePeakDisplays (_route.get());
 	}
 
 	return true;
@@ -331,11 +354,19 @@ GainMeterBase::reset_peak_display ()
 	_meter->reset_max();
 	level_meter->clear_meters();
 	max_peak = -INFINITY;
-	peak_display.set_label (_("-Inf"));
+	peak_display.set_label (_("-inf"));
 	peak_display.set_name ("MixerStripPeakDisplay");
 }
 
 void
+GainMeterBase::reset_route_peak_display (Route* route)
+{
+	if (_route && _route.get() == route) {
+		reset_peak_display ();
+	}
+}
+
+void
 GainMeterBase::reset_group_peak_display (RouteGroup* group)
 {
 	if (_route && group == _route->route_group()) {
@@ -495,7 +526,12 @@ GainMeterBase::gain_changed ()
 void
 GainMeterBase::set_meter_strip_name (const char * name)
 {
+	char tmp[256];
 	meter_metric_area.set_name (name);
+	sprintf(tmp, "Mark%sLeft", name);
+	meter_ticks1_area.set_name (tmp);
+	sprintf(tmp, "Mark%sRight", name);
+	meter_ticks2_area.set_name (tmp);
 }
 
 void
@@ -822,17 +858,14 @@ GainMeterBase::update_meters()
 			snprintf (buf, sizeof(buf), "%.1f", mpeak);
 			peak_display.set_label (buf);
 		}
-
-		if (mpeak >= 0.0f) {
-			peak_display.set_name ("MixerStripPeakDisplayPeak");
-		}
+	}
+	if (mpeak >= Config->get_meter_peak()) {
+		peak_display.set_name ("MixerStripPeakDisplayPeak");
 	}
 }
 
 void GainMeterBase::color_handler(bool dpi)
 {
-	color_changed = true;
-	dpi_changed = (dpi) ? true : false;
 	setup_meters();
 }
 
@@ -840,14 +873,25 @@ void
 GainMeterBase::set_width (Width w, int len)
 {
 	_width = w;
-	level_meter->setup_meters (len);
+	int meter_width = 5;
+	if (_width == Wide && _route && _route->shared_peak_meter()->input_streams().n_total() == 1) {
+		meter_width = 10;
+	}
+	level_meter->setup_meters(len, meter_width);
 }
 
 
 void
 GainMeterBase::on_theme_changed()
 {
-	style_changed = true;
+}
+
+void
+GainMeterBase::redraw_metrics()
+{
+	meter_metric_area.queue_draw ();
+	meter_ticks1_area.queue_draw ();
+	meter_ticks2_area.queue_draw ();
 }
 
 GainMeter::GainMeter (Session* s, int fader_length)
@@ -861,7 +905,7 @@ GainMeter::GainMeter (Session* s, int fader_length)
 	gain_display_box.pack_start (gain_display, true, true);
 
 	meter_metric_area.set_name ("AudioTrackMetrics");
-	set_size_request_to_display_given_text (meter_metric_area, "-127", 1, 0);
+	meter_metric_area.set_size_request(24, -1);
 
 	gain_automation_style_button.set_name ("mixer strip button");
 	gain_automation_state_button.set_name ("mixer strip button");
@@ -894,15 +938,30 @@ GainMeter::GainMeter (Session* s, int fader_length)
 
 	meter_metric_area.signal_expose_event().connect (
 		sigc::mem_fun(*this, &GainMeter::meter_metrics_expose));
+
+	meter_ticks1_area.set_size_request(3,-1);
+	meter_ticks2_area.set_size_request(3,-1);
+
+	meter_ticks1_area.signal_expose_event().connect (
+			sigc::mem_fun(*this, &GainMeter::meter_ticks1_expose));
+	meter_ticks2_area.signal_expose_event().connect (
+			sigc::mem_fun(*this, &GainMeter::meter_ticks2_expose));
+
+	meter_hbox.pack_start (meter_ticks1_area, false, false);
+	meter_hbox.pack_start (meter_alignment, false, false);
+	meter_hbox.pack_start (meter_ticks2_area, false, false);
+	meter_hbox.pack_start (meter_metric_area, false, false);
 }
 
+GainMeter::~GainMeter () { }
+
 void
 GainMeter::set_controls (boost::shared_ptr<Route> r,
 			 boost::shared_ptr<PeakMeter> meter,
 			 boost::shared_ptr<Amp> amp)
 {
-	if (meter_alignment.get_parent()) {
-		hbox.remove (meter_alignment);
+	if (meter_hbox.get_parent()) {
+		hbox.remove (meter_hbox);
 	}
 
 //	if (gain_automation_state_button.get_parent()) {
@@ -915,221 +974,79 @@ GainMeter::set_controls (boost::shared_ptr<Route> r,
 		_meter->ConfigurationChanged.connect (
 			model_connections, invalidator (*this), boost::bind (&GainMeter::meter_configuration_changed, this, _1), gui_context()
 			);
+		_meter->TypeChanged.connect (
+			model_connections, invalidator (*this), boost::bind (&GainMeter::meter_type_changed, this, _1), gui_context()
+			);
 
 		meter_configuration_changed (_meter->input_streams ());
 	}
 
 
+	if (_route) {
+		_route->active_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::route_active_changed, this), gui_context ());
+	}
+
 	/*
 	   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_alignment, true, true);
+	hbox.pack_start (meter_hbox, true, true);
 
 //	if (r && !r->is_auditioner()) {
 //		fader_vbox->pack_start (gain_automation_state_button, false, false, 0);
 //	}
 
-	setup_meters ();
 	hbox.show_all ();
+	setup_meters ();
 }
 
 int
 GainMeter::get_gm_width ()
 {
 	Gtk::Requisition sz;
-	hbox.size_request (sz);
-	return sz.width;
+	int min_w = 0;
+	meter_metric_area.size_request (sz);
+	min_w += sz.width;
+	level_meter->size_request (sz);
+	min_w += sz.width;
+
+	fader_alignment.size_request (sz);
+	if (_width == Wide)
+		return max(sz.width * 2, min_w * 2) + 6;
+	else
+		return sz.width + min_w + 6;
+
 }
 
-cairo_pattern_t*
-GainMeter::render_metrics (Gtk::Widget& w, vector<DataType> types)
+gint
+GainMeter::meter_metrics_expose (GdkEventExpose *ev)
 {
-	Glib::RefPtr<Gdk::Window> win (w.get_window());
-
-	gint width, height;
-	win->get_size (width, height);
-
-	cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
-	cairo_t* cr = cairo_create (surface);
-	Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(w.get_pango_context());
-
-
-	Pango::AttrList audio_font_attributes;
-	Pango::AttrList midi_font_attributes;
-
-	Pango::AttrFontDesc* font_attr;
-	Pango::FontDescription font;
-
-	font = Pango::FontDescription (""); // use defaults
-	//font = get_font_for_style("gain-fader");
-	//font = w.get_style()->get_font();
-
-	font.set_weight (Pango::WEIGHT_NORMAL);
-	font.set_size (10.0 * PANGO_SCALE);
-	font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
-	audio_font_attributes.change (*font_attr);
-	delete font_attr;
-
-	font.set_weight (Pango::WEIGHT_ULTRALIGHT);
-	font.set_stretch (Pango::STRETCH_ULTRA_CONDENSED);
-	font.set_size (7.5 * PANGO_SCALE);
-	font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
-	midi_font_attributes.change (*font_attr);
-	delete font_attr;
-
-
-	cairo_move_to (cr, 0, 0);
-	cairo_rectangle (cr, 0, 0, width, height);
-	{
-		Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL);
-		cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
-	}
-	cairo_fill (cr);
-
-	for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
-
-		Gdk::Color c;
-
-		if (types.size() > 1) {
-			/* we're overlaying more than 1 set of marks, so use different colours */
-			Gdk::Color c;
-			switch (*i) {
-			case DataType::AUDIO:
-				c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
-				cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
-				break;
-			case DataType::MIDI:
-				c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
-				cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
-				break;
-			}
-		} else {
-			c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
-			cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
-		}
-
-		vector<int> points;
-
-		switch (*i) {
-		case DataType::AUDIO:
-			layout->set_attributes (audio_font_attributes);
-			points.push_back (-50);
-			points.push_back (-40);
-			points.push_back (-30);
-			points.push_back (-20);
-			points.push_back (-10);
-			points.push_back (-3);
-			points.push_back (0);
-			points.push_back (4);
-			break;
-
-		case DataType::MIDI:
-			layout->set_attributes (midi_font_attributes);
-			points.push_back (0);
-			if (types.size() == 1) {
-				points.push_back (32);
-			} else {
-				/* tweak so as not to overlay the -30dB mark */
-				points.push_back (48);
-			}
-			points.push_back (64);
-			points.push_back (96);
-			points.push_back (127);
-			break;
-		}
-
-		char buf[32];
-
-		for (vector<int>::const_iterator j = points.begin(); j != points.end(); ++j) {
-
-			float fraction = 0;
-			switch (*i) {
-			case DataType::AUDIO:
-				fraction = log_meter (*j);
-				break;
-			case DataType::MIDI:
-				fraction = *j / 127.0;
-				break;
-			}
-
-			gint const pos = height - (gint) floor (height * fraction);
-
-			cairo_set_line_width (cr, 1.0);
-			cairo_move_to (cr, 0, pos);
-			cairo_line_to (cr, 3.5, pos);
-			cairo_stroke (cr);
-			
-			snprintf (buf, sizeof (buf), "%2d", abs (*j));
-			layout->set_text(buf);
-
-			/* we want logical extents, not ink extents here */
-
-			int tw, th;
-			layout->get_pixel_size(tw, th);
-
-			int p = pos - (th / 2);
-			p = min (p, height - th);
-			p = max (p, 0);
-
-			cairo_move_to (cr, 5, p);
-			pango_cairo_show_layout (cr, layout->gobj());
-		}
+	if (!_route) {
+		if (_types.empty()) { _types.push_back(DataType::AUDIO); }
+		return meter_expose_metrics(ev, MeterPeak, _types, &meter_metric_area);
 	}
+	return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area);
+}
 
-	cairo_pattern_t* pattern = cairo_pattern_create_for_surface (surface);
-	MetricPatterns::iterator p;
-
-	if ((p = metric_patterns.find (w.get_name())) != metric_patterns.end()) {
-		cairo_pattern_destroy (p->second);
+gint
+GainMeter::meter_ticks1_expose (GdkEventExpose *ev)
+{
+	if (!_route) {
+		if (_types.empty()) { _types.push_back(DataType::AUDIO); }
+		return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks1_area);
 	}
-
-	metric_patterns[w.get_name()] = pattern;
-	
-	cairo_destroy (cr);
-	cairo_surface_destroy (surface);
-
-	return pattern;
+	return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area);
 }
 
 gint
-GainMeter::meter_metrics_expose (GdkEventExpose *ev)
+GainMeter::meter_ticks2_expose (GdkEventExpose *ev)
 {
-	Glib::RefPtr<Gdk::Window> win (meter_metric_area.get_window());
-	cairo_t* cr;
-
-	cr = gdk_cairo_create (win->gobj());
-	
-	/* clip to expose area */
-
-	gdk_cairo_rectangle (cr, &ev->area);
-	cairo_clip (cr);
-
-	cairo_pattern_t* pattern;
-	MetricPatterns::iterator i = metric_patterns.find (meter_metric_area.get_name());
-
-	if (i == metric_patterns.end() || style_changed || dpi_changed) {
-		pattern = render_metrics (meter_metric_area, _types);
-	} else {
-		pattern = i->second;
+	if (!_route) {
+		if (_types.empty()) { _types.push_back(DataType::AUDIO); }
+		return meter_expose_ticks(ev, MeterPeak, _types, &meter_ticks2_area);
 	}
-
-	cairo_move_to (cr, 0, 0);
-	cairo_set_source (cr, pattern);
-
-	gint width, height;
-	win->get_size (width, height);
-
-	cairo_rectangle (cr, 0, 0, width, height);
-	cairo_fill (cr);
-
-	style_changed = false;
-	dpi_changed = false;
-
-	cairo_destroy (cr);
-
-	return true;
+	return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area);
 }
 
 boost::shared_ptr<PBD::Controllable>
@@ -1151,15 +1068,65 @@ GainMeterBase::level_meter_button_press (GdkEventButton* ev)
 void
 GainMeter::meter_configuration_changed (ChanCount c)
 {
+	int type = 0;
 	_types.clear ();
 
 	for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
 		if (c.get (*i) > 0) {
 			_types.push_back (*i);
+			type |= 1 << (*i);
 		}
 	}
 
-	style_changed = true;
-	meter_metric_area.queue_draw ();
+	if (_route
+			&& boost::dynamic_pointer_cast<AudioTrack>(_route) == 0
+			&& boost::dynamic_pointer_cast<MidiTrack>(_route) == 0
+			) {
+		if (_route->active()) {
+			set_meter_strip_name ("AudioBusMetrics");
+		} else {
+			set_meter_strip_name ("AudioBusMetricsInactive");
+		}
+	}
+	else if (
+			   (type == (1 << DataType::MIDI))
+			|| (_route && boost::dynamic_pointer_cast<MidiTrack>(_route))
+			) {
+		if (!_route || _route->active()) {
+			set_meter_strip_name ("MidiTrackMetrics");
+		} else {
+			set_meter_strip_name ("MidiTrackMetricsInactive");
+		}
+	}
+	else if (type == (1 << DataType::AUDIO)) {
+		if (!_route || _route->active()) {
+			set_meter_strip_name ("AudioTrackMetrics");
+		} else {
+			set_meter_strip_name ("AudioTrackMetricsInactive");
+		}
+	} else {
+		if (!_route || _route->active()) {
+			set_meter_strip_name ("AudioMidiTrackMetrics");
+		} else {
+			set_meter_strip_name ("AudioMidiTrackMetricsInactive");
+		}
+	}
+
+	setup_meters();
+	meter_clear_pattern_cache(4);
+}
+
+void
+GainMeter::route_active_changed ()
+{
+	if (_meter) {
+		meter_configuration_changed (_meter->input_streams ());
+	}
 }
 
+void
+GainMeter::meter_type_changed (MeterType t)
+{
+	_route->set_meter_type(t);
+	RedrawMetrics();
+}
diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h
index cec8441..8286cbe 100644
--- a/gtk2_ardour/gain_meter.h
+++ b/gtk2_ardour/gain_meter.h
@@ -85,10 +85,11 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
 	void set_flat_buttons ();
 
 	virtual void setup_meters (int len=0);
+	virtual void set_type (ARDOUR::MeterType);
 
 	boost::shared_ptr<PBD::Controllable> get_controllable();
 
-	LevelMeter& get_level_meter() const { return *level_meter; }
+	LevelMeterHBox& get_level_meter() const { return *level_meter; }
 	Gtkmm2ext::SliderController& get_gain_slider() const { return *gain_slider; }
 
 	/** Emitted in the GUI thread when a button is pressed over the level meter;
@@ -99,6 +100,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
   protected:
 
 	friend class MixerStrip;
+	friend class MeterStrip;
 	boost::shared_ptr<ARDOUR::Route> _route;
 	boost::shared_ptr<ARDOUR::PeakMeter> _meter;
 	boost::shared_ptr<ARDOUR::Amp> _amp;
@@ -113,7 +115,9 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
 	Gtkmm2ext::FocusEntry        gain_display;
 	Gtk::Button                  peak_display;
 	Gtk::DrawingArea             meter_metric_area;
-	LevelMeter                  *level_meter;
+	Gtk::DrawingArea             meter_ticks1_area;
+	Gtk::DrawingArea             meter_ticks2_area;
+	LevelMeterHBox              *level_meter;
 
 	sigc::connection gain_watching;
 
@@ -178,15 +182,11 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
 	void parameter_changed (const char*);
 
 	void reset_peak_display ();
+	void reset_route_peak_display (ARDOUR::Route*);
 	void reset_group_peak_display (ARDOUR::RouteGroup*);
 
-	static sigc::signal<void> ResetAllPeakDisplays;
-	static sigc::signal<void,ARDOUR::RouteGroup*> ResetGroupPeakDisplays;
-
+	void redraw_metrics ();
 	void on_theme_changed ();
-	bool style_changed;
-	bool dpi_changed;
-	bool color_changed;
 	void color_handler(bool);
 	ARDOUR::DataType _data_type;
 	ARDOUR::ChanCount _previous_amp_output_streams;
@@ -201,7 +201,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox
 {
   public:
          GainMeter (ARDOUR::Session*, int);
-	~GainMeter () {}
+	virtual ~GainMeter ();
 
 	virtual void set_controls (boost::shared_ptr<ARDOUR::Route> route,
 				   boost::shared_ptr<ARDOUR::PeakMeter> meter,
@@ -209,24 +209,26 @@ class GainMeter : public GainMeterBase, public Gtk::VBox
 
 	int get_gm_width ();
 	void setup_meters (int len=0);
+	void set_type (ARDOUR::MeterType);
+	void route_active_changed ();
 
   protected:
 	void hide_all_meters ();
 
 	gint meter_metrics_expose (GdkEventExpose *);
-
-	typedef std::map<std::string,cairo_pattern_t*> MetricPatterns;
-	static  MetricPatterns metric_patterns;
-	static  cairo_pattern_t* render_metrics (Gtk::Widget &, std::vector<ARDOUR::DataType>);
+	gint meter_ticks1_expose (GdkEventExpose *);
+	gint meter_ticks2_expose (GdkEventExpose *);
 
   private:
 
 	void meter_configuration_changed (ARDOUR::ChanCount);
+	void meter_type_changed (ARDOUR::MeterType);
 
 	Gtk::HBox  gain_display_box;
 	Gtk::HBox  fader_box;
 	Gtk::VBox* fader_vbox;
 	Gtk::HBox  hbox;
+	Gtk::HBox  meter_hbox;
 	Gtk::Alignment fader_alignment;
 	Gtk::Alignment meter_alignment;
 	std::vector<ARDOUR::DataType> _types;
diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc
index 52bb468..971dfc0 100644
--- a/gtk2_ardour/generic_pluginui.cc
+++ b/gtk2_ardour/generic_pluginui.cc
@@ -661,7 +661,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
 		control_ui->display_label->set_name ("ParameterValueDisplay");
 
 		control_ui->display->add (*control_ui->display_label);
-		Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->display, "-99,99", 2, 2);
+		Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->display, "-888.8g", 2, 6);
 
 		control_ui->display->show_all ();
 
@@ -671,7 +671,17 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
 		MeterInfo * info = new MeterInfo(port_index);
  		control_ui->meterinfo = info;
 
-		info->meter = new FastMeter (5, 5, FastMeter::Vertical);
+		info->meter = new FastMeter (
+				5, 5, FastMeter::Vertical, 0,
+				0x0000aaff,
+				0x008800ff, 0x008800ff,
+				0x00ff00ff, 0x00ff00ff,
+				0xcccc00ff, 0xcccc00ff,
+				0xffaa00ff, 0xffaa00ff,
+				0xff0000ff,
+				ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(),
+				ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get()
+				);
 
 		info->min_unbound = desc.min_unbound;
 		info->max_unbound = desc.max_unbound;
@@ -682,6 +692,9 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
 		control_ui->vbox = manage (new VBox);
 		control_ui->hbox = manage (new HBox);
 
+		control_ui->hbox->set_spacing(1);
+		control_ui->vbox->set_spacing(3);
+
 		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);
@@ -836,7 +849,7 @@ GenericPluginUI::start_updating (GdkEventAny*)
 {
 	if (output_controls.size() > 0 ) {
 		screen_update_connection.disconnect();
-		screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
+		screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
 			(sigc::mem_fun(*this, &GenericPluginUI::output_update));
 	}
 	return false;
diff --git a/gtk2_ardour/global_port_matrix.cc b/gtk2_ardour/global_port_matrix.cc
index fcd9960..8c1fde3 100644
--- a/gtk2_ardour/global_port_matrix.cc
+++ b/gtk2_ardour/global_port_matrix.cc
@@ -192,6 +192,15 @@ GlobalPortMatrixWindow::set_session (Session* s)
 	}
 }
 
+void
+GlobalPortMatrix::set_session (Session *s)
+{
+	SessionHandlePtr::set_session (s);
+	if (!s) return;
+	setup_all_ports ();
+	init();
+}
+
 string
 GlobalPortMatrix::disassociation_verb () const
 {
diff --git a/gtk2_ardour/global_port_matrix.h b/gtk2_ardour/global_port_matrix.h
index 1dabcbd..d45a639 100644
--- a/gtk2_ardour/global_port_matrix.h
+++ b/gtk2_ardour/global_port_matrix.h
@@ -31,6 +31,7 @@ public:
 	GlobalPortMatrix (Gtk::Window*, ARDOUR::Session*, ARDOUR::DataType);
 
 	void setup_ports (int);
+	void set_session (ARDOUR::Session* s);
 
 	void set_state (ARDOUR::BundleChannel c[2], bool);
 	PortMatrixNode::State get_state (ARDOUR::BundleChannel c[2]) const;
diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc
index 1332d4b..b8d30dc 100644
--- a/gtk2_ardour/group_tabs.cc
+++ b/gtk2_ardour/group_tabs.cc
@@ -42,7 +42,7 @@ GroupTabs::GroupTabs ()
 	, _dragging (0)
 	, _dragging_new_tab (0)
 {
-
+	add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
 }
 
 GroupTabs::~GroupTabs ()
@@ -175,6 +175,8 @@ GroupTabs::on_motion_notify_event (GdkEventMotion* ev)
 	set_dirty ();
 	queue_draw ();
 
+	gdk_event_request_motions(ev);
+
 	return true;
 }
 
diff --git a/gtk2_ardour/icons/grabber_note.png b/gtk2_ardour/icons/grabber_note.png
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/icons/join_tools.png b/gtk2_ardour/icons/join_tools.png
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/icons/tav_exp.png b/gtk2_ardour/icons/tav_exp.png
old mode 100755
new mode 100644
index 7b0d025..0e8daf5
Binary files a/gtk2_ardour/icons/tav_exp.png and b/gtk2_ardour/icons/tav_exp.png differ
diff --git a/gtk2_ardour/icons/tav_shrink.png b/gtk2_ardour/icons/tav_shrink.png
old mode 100755
new mode 100644
index 72b766b..44b4277
Binary files a/gtk2_ardour/icons/tav_shrink.png and b/gtk2_ardour/icons/tav_shrink.png differ
diff --git a/gtk2_ardour/icons/trim_left_cursor_right_only.png b/gtk2_ardour/icons/trim_left_cursor_right_only.png
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/icons/trim_right_cursor_left_only.png b/gtk2_ardour/icons/trim_right_cursor_left_only.png
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/imageframe.h b/gtk2_ardour/imageframe.h
deleted file mode 100644
index a752cdb..0000000
--- a/gtk2_ardour/imageframe.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// -*- c++ -*-
-#ifndef _LIBGNOMECANVASMM_IMAGEFRAME_H
-#define _LIBGNOMECANVASMM_IMAGEFRAME_H
-
-#include <glibmm.h>
-
-
-/* rect.h
- *
- * Copyright (C) 1998 EMC Capital Management Inc.
- * Developed by Havoc Pennington <hp at pobox.com>
- *
- * Copyright (C) 1999 The Gtk-- Development Team
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <stdint.h>
-#include <libgnomecanvasmm/item.h>
-#include <libgnomecanvasmm/group.h>
-#include <libgnomecanvasmm/shape.h>
-
-#include <libgnomecanvas/libgnomecanvas.h>
-#include <gtk/gtkenums.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include <libart_lgpl/art_misc.h>
-#ifdef __cplusplus
-}
-#endif
-
-#include <libart_lgpl/art_pixbuf.h>
-
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-typedef struct _GnomeCanvasImageFrame GnomeCanvasImageFrame;
-typedef struct _GnomeCanvasImageFrameClass GnomeCanvasImageFrameClass;
-#endif /* DOXYGEN_SHOULD_SKIP_THIS */
-
-
-namespace Gnome
-{
-
-namespace Canvas
-{ class ImageFrame_Class; } // namespace Canvas
-
-} // namespace Gnome
-namespace Gnome
-{
-
-namespace Canvas
-{
-
-//class Group;
-
-
-class ImageFrame : public Item
-{
-  public:
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-  typedef ImageFrame CppObjectType;
-  typedef ImageFrame_Class CppClassType;
-  typedef GnomeCanvasImageFrame BaseObjectType;
-  typedef GnomeCanvasImageFrameClass BaseClassType;
-#endif /* DOXYGEN_SHOULD_SKIP_THIS */
-
-  virtual ~ImageFrame();
-
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-
-private:
-  friend class ImageFrame_Class;
-  static CppClassType rect_class_;
-
-  // noncopyable
-  ImageFrame(const ImageFrame&);
-  ImageFrame& operator=(const ImageFrame&);
-
-protected:
-  explicit ImageFrame(const Glib::ConstructParams& construct_params);
-  explicit ImageFrame(GnomeCanvasImageFrame* castitem);
-
-#endif /* DOXYGEN_SHOULD_SKIP_THIS */
-
-public:
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-  static GType get_type()      G_GNUC_CONST;
-  static GType get_base_type() G_GNUC_CONST;
-#endif
-
-  ///Provides access to the underlying C GtkObject.
-  GnomeCanvasImageFrame*       gobj()       { return reinterpret_cast<GnomeCanvasImageFrame*>(gobject_); }
-
-  ///Provides access to the underlying C GtkObject.
-  const GnomeCanvasImageFrame* gobj() const { return reinterpret_cast<GnomeCanvasImageFrame*>(gobject_); }
-
-
-public:
-  //C++ methods used to invoke GTK+ virtual functions:
-
-protected:
-  //GTK+ Virtual Functions (override these to change behaviour):
-
-  //Default Signal Handlers::
-
-
-private:
-
-
-public:
-    ImageFrame(Group& parentx, ArtPixBuf* pbuf, double x, double y, Gtk::AnchorType anchor, double w, double h);
-    explicit ImageFrame(Group& parent);
-
-    Glib::PropertyProxy<double> property_x();
-    Glib::PropertyProxy_ReadOnly<double> property_x() const;
-    Glib::PropertyProxy<double> property_y();
-    Glib::PropertyProxy_ReadOnly<double> property_y() const;
-    Glib::PropertyProxy<double> property_width();
-    Glib::PropertyProxy_ReadOnly<double> property_width() const;
-    Glib::PropertyProxy<double> property_drawwidth();
-    Glib::PropertyProxy_ReadOnly<double> property_drawwidth() const;
-    Glib::PropertyProxy<double> property_height();
-    Glib::PropertyProxy_ReadOnly<double> property_height() const;
-    Glib::PropertyProxy<Gtk::AnchorType> property_anchor() ;
-    Glib::PropertyProxy_ReadOnly<Gtk::AnchorType> property_anchor() const;
-
-};
-
-} /* namespace Canvas */
-} /* namespace Gnome */
-
-namespace Glib
-{
-  /** @relates Gnome::Canvas::ImageFrame
-   * @param object The C instance
-   * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref.
-   * @result A C++ instance that wraps this C instance.
-   */
-  Gnome::Canvas::ImageFrame* wrap(GnomeCanvasImageFrame* object, bool take_copy = false);
-}
-#endif /* _LIBGNOMECANVASMM_IMAGEFRAME_H */
-
diff --git a/gtk2_ardour/imageframe_p.h b/gtk2_ardour/imageframe_p.h
deleted file mode 100644
index e37a6ea..0000000
--- a/gtk2_ardour/imageframe_p.h
+++ /dev/null
@@ -1,66 +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.
-
-*/
-
-// -*- c++ -*-
-#ifndef _LIBGNOMECANVASMM_IMAGEFRAME_P_H
-#define _LIBGNOMECANVASMM_IMAGEFRAME_P_H
-
-#include <glibmm/class.h>
-
-namespace Gnome
-{
-
-namespace Canvas
-{
-
-class ImageFrame_Class : public Glib::Class
-{
-public:
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-  typedef ImageFrame CppObjectType;
-  typedef GnomeCanvasImageFrame BaseObjectType;
-  typedef GnomeCanvasImageFrameClass BaseClassType;
-  typedef Shape_Class CppClassParent;
-  typedef GnomeCanvasItemClass BaseClassParent;
-
-  friend class ImageFrame;
-#endif /* DOXYGEN_SHOULD_SKIP_THIS */
-
-  const Glib::Class& init();
-
-  static void class_init_function(void* g_class, void* class_data);
-
-  static Glib::ObjectBase* wrap_new(GObject*);
-
-protected:
-
-  //Callbacks (default signal handlers):
-  //These will call the *_impl member methods, which will then call the existing default signal callbacks, if any.
-  //You could prevent the original default signal handlers being called by overriding the *_impl method.
-
-  //Callbacks (virtual functions):
-};
-
-
-} // namespace Canvas
-
-} // namespace Gnome
-
-#endif /* _LIBGNOMECANVASMM_IMAGEFRAME_P_H */
-
diff --git a/gtk2_ardour/imageframe_socket_handler.h b/gtk2_ardour/imageframe_socket_handler.h
deleted file mode 100644
index d12b828..0000000
--- a/gtk2_ardour/imageframe_socket_handler.h
+++ /dev/null
@@ -1,703 +0,0 @@
-/*
-    Copyright (C) 2003 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_imageframe_socket_handler_h__
-#define __ardour_gtk_imageframe_socket_handler_h__
-
-#include <string>
-#include <list>
-#include "ardour_image_compositor_socket.h"
-
-class TimeAxisViewItem ;
-class ImageFrameView ;
-class MarkerView ;
-class ImageFrameTimeAxisGroup ;
-class Editor ;
-
-/**
- * ImageFrameSocketHandler defines the handler between Ardour and an Image Compositor
- * As this is purely visual, we do all processing within the main gtk loop via
- * message passing through a socket.
- *
- */
-class ImageFrameSocketHandler : public sigc::trackable
-{
-	public:
-		/**
-		 * Constructs a new ImageFrameSocketHandler to handle communication between Ardour and the Image Compositor
-		 *
-		 * @param ed the PublicEditor
-		 */
-		ImageFrameSocketHandler(PublicEditor& ed) ;
-
-		/**
-		 * Descructor
-		 * this will shutdown the socket if open
-		 */
-		virtual ~ImageFrameSocketHandler() ;
-
-		/**
-		 * Returns the instance of the ImageFrameSocketHandler
-		 * the instance should first be created with createInstance
-		 *
-		 * @return the instance of the ImageFrameSocketHandler
-		 */
-		static ImageFrameSocketHandler* get_instance() ;
-
-		/**
-		 * call back to handle doing the processing work
-		 * This method is added to the gdk main loop and called when there is data
-		 * upon the socket.
-		 *
-		 */
-		static void image_socket_callback(void *arg, int32_t fd, GdkInputCondition cond) ;
-
-		/**
-		 * Attempt to connect to the image compositor on the specified host and port
-		 *
-		 * @param hostIp the ip address of the image compositor host
-		 * @param port the oprt number to attemp the connection on
-		 * @return true if the connection was a succees
-		 *         false otherwise
-		 */
-		bool connect(const char * hostIp, int32_t port) ;
-
-		/**
-		 * Closes the connection to th Image Compositor
-		 *
-		 */
-		 void close_connection() ;
-		/**
-		 * Returns true if this ImagFrameSocketHandler is currently connected to rthe image compositor
-		 *
-		 * @return true if connected to the image compositor
-		 */
-		bool is_connected() ;
-
-		/**
-		 * Sets the tag used to describe this input within gtk
-		 * this is returned when gdk_input_add is called and is required to remove the input
-		 *
-		 * @param tag the gdk input tag of this input
-		 */
-		void set_gdk_input_tag(int tag) ;
-
-		/**
-		 * Returns the gdk input tag of this input
-		 *
-		 * @return the gdk input tag of this input
-		 * @see setGdkInputTag
-		 */
-		int get_gdk_input_tag() ;
-
-
-		/**
-		 * Returns the socket file descriptor
-		 *
-		 * @return the Sockt file descriptor
-		 */
-		int get_socket_descriptor() ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Handle Sending messages to the Image Compositor
-
-		//----------------------------
-		// ImageFrameTimeAxis Messages
-
-		/**
-		 * Sends a message stating that the named image frame time axis has been removed
-		 *
-		 * @param track_id the unique id of the removed image frame time axis
-		 * @param src the identity of the object that initiated the change
-		 */
-		void send_imageframe_time_axis_removed(const std::string & track_id, void* src) ;
-
-		/**
-		 * Sends a message indicating that an ImageFrameTimeAxis has been renamed
-		 *
-		 * @param new_id the new name, or Id, of the track
-		 * @param old_id the old name, or Id, of the track
-		 * @param src the identity of the object that initiated the change
-		 * @param time_axis the time axis that has changed
-		 */
-		void send_imageframe_time_axis_renamed(const std::string & new_id, const std::string & old_id, void* src, ImageFrameTimeAxis* time_axis) ;
-
-		//------------------------
-		// MarkerTimeAxis Messages
-
-		/**
-		 * Sends a message stating that the named marker time axis has been removed
-		 *
-		 * @param track_id the unique id of the removed image frame time axis
-		 * @param src the identity of the object that initiated the change
-		 */
-		void send_marker_time_axis_removed(const std::string & track_id, void* src) ;
-
-		/**
-		 * Sends a message indicating that an MarkerTimeAxis has been renamed
-		 *
-		 * @param new_id the new name, or Id, of the track
-		 * @param old_id the old name, or Id, of the track
-		 * @param src the identity of the object that initiated the change
-		 * @param time_axis the time axis that has changed
-		 */
-		void send_marker_time_axis_renamed(const std::string & new_id, const std::string & old_id, void* src, MarkerTimeAxis* time_axis) ;
-
-
-		//---------------------------------
-		// ImageFrameTimeAxisGroup Messages
-
-		/**
-		 * Sends a message stating that the group has been removed
-		 *
-		 * @param group_id the unique id of the removed image frame time axis
-		 * @param src the identity of the object that initiated the change
-		 * @param group the group that has changed
-		 */
-		void send_imageframe_time_axis_group_removed(const std::string & group_id, void* src, ImageFrameTimeAxisGroup* group) ;
-
-		/**
-		 * Send a message indicating that an ImageFrameTimeAxisGroup has been renamed
-		 *
-		 * @param new_id the new name, or Id, of the group
-		 * @param old_id the old name, or Id, of the group
-		 * @param src the identity of the object that initiated the change
-		 * @param group the group that has changed
-		 */
-		void send_imageframe_time_axis_group_renamed(const std::string & new_id, const std::string & old_id, void* src, ImageFrameTimeAxisGroup* group) ;
-
-
-		//---------------------------------
-		// ImageFrameView Messages
-
-		/**
-		 * Send an Image Frame View Item position changed message
-		 *
-		 * @param pos the new position value
-		 * @param src the identity of the object that initiated the change
-		 * @param item the time axis item whos position has changed
-		 */
-		void send_imageframe_view_position_change(nframes_t pos, void* src, ImageFrameView* item) ;
-
-		/**
-		 * Send a Image Frame View item duration changed message
-		 *
-		 * @param dur the the new duration value
-		 * @param src the identity of the object that initiated the change
-		 * @param item the item which has had a duration change
-		 */
-		void send_imageframe_view_duration_change(nframes_t dur, void* src, ImageFrameView* item) ;
-
-		/**
-		 * Send a message indicating that an ImageFrameView has been renamed
-		 *
-		 * @param item the ImageFrameView which has been renamed
-		 * @param src the identity of the object that initiated the change
-		 * @param item the renamed item
-		 */
-		void send_imageframe_view_renamed(const std::string & new_id, const std::string & old_id, void* src, ImageFrameView* item) ;
-
-		/**
-		 * Send a message indicating that an ImageFrameView item has been removed message
-		 *
-		 * @param item_id the id of the item that was removed
-		 * @param src the identity of the object that initiated the change
-		 * @param item the removed item
-		 */
-		void send_imageframe_view_removed(const std::string & item_id, void* src, ImageFrameView* item) ;
-
-		//---------------------------------
-		// MarkerView Messages
-
-		/**
-		 * Send a Marker View Item position changed message
-		 *
-		 * @param pos the new position value
-		 * @param src the identity of the object that initiated the change
-		 * @param item the time axis item whos position has changed
-		 */
-		void send_marker_view_position_change(nframes_t pos, void* src, MarkerView* item) ;
-
-		/**
-		 * Send a Marker View item duration changed message
-		 *
-		 * @param dur the new duration value
-		 * @param src the identity of the object that initiated the change
-		 * @param item the time axis item whos position has changed
-		 */
-		void send_marker_view_duration_change(nframes_t dur, void* src, MarkerView* item) ;
-
-		/**
-		 * Send a message indicating that a MarkerView has been renamed
-		 *
-		 * @param new_id the new_id of the object
-		 * @param old_id the old_id of the object
-		 * @param src the identity of the object that initiated the change
-		 * @param item the MarkerView which has been renamed
-		 */
-		void send_marker_view_renamed(const std::string & new_id, const std::string & old_id, void* src, MarkerView* item) ;
-
-		/**
-		 * Send a message indicating that a MarkerView  item has been removed message
-		 *
-		 * @param item_id the id of the item that was removed
-		 * @param src the identity of the object that initiated the change
-		 * @param item the MarkerView which has been removed
-		 */
-		void send_marker_view_removed(const std::string & item_id, void* src, MarkerView* item) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Emitted Signals
-
-		/** Emitted if the socket connection is shutdown at the other end */
-		sigc::signal<void> CompositorSocketShutdown ;
-
-		/** Emitted as a generic error is captured from the socket connection to the animatic compositor */
-		sigc::signal<void> CompositorSocketError ;
-
-
-	protected:
-
-
-	private:
-		/* I dont like friends :-( */
-		friend class Editor;
-
-		/**
-		 * Create an new instance of the ImageFrameSocketHandler, if one does not already exist
-		 *
-		 * @param ed the Ardour PublicEditor
-		 */
-		static ImageFrameSocketHandler* create_instance(PublicEditor& ed) ;
-
-		//---------------------------------------------------------------------------------------//
-		// Message breakdown ie avoid a big if...then...else
-
-		/**
-	 	 * Handle insert item requests
-		 *
-		 * @param msg the received message
-		 */
-		void handle_insert_message(const char* msg) ;
-
-		/**
-		 * Handle remove item requests
-		 *
-		 * @param msg the received message
-		 */
-		void handle_remove_message(const char* msg) ;
-
-		/**
-		 * Handle rename item requests
-		 *
-		 * @param msg the received message
-		 */
-		void handle_rename_message(const char* msg) ;
-
-		/**
-	 	 * Handle a request for session information
-	 	 *
-	 	 * @param msg the received message
-	 	 */
-		void handle_request_data(const char* msg) ;
-
-		/**
-		 * Handle the update of a particular item
-		 *
-		 * @param msg the received message
-		 */
-		void handle_item_update_message(const char* msg) ;
-
-		/**
-		 * Handle the selection of an Item
-		 *
-		 * @param msg the received message
-		 */
-		void handle_item_selected(const char* msg) ;
-
-		/**
-		 * Handle s session action message
-		 *
-		 * @param msg the received message
-		 */
-		void handle_session_action(const char* msg) ;
-
-		//---------------------------------------------------------------------------------------//
-		// handlers for specific insert procedures
-
-		/**
-		 * Handle the insertion of a new ImaegFrameTimeAxis
-		 *
-		 * @param msg the received message
-		 */
-		void handle_insert_imageframe_time_axis(const char* msg) ;
-
-		/**
-		 * Handle the insertion of a new MarkerTimeAxis
-		 *
-		 * @param msg the received message
-		 */
-		void handle_insert_marker_time_axis(const char* msg) ;
-
-		/**
-		 * Handle the insertion of a time axis group (a scene)
-		 *
-		 * @param msg the received message
-		 */
-		void handle_insert_imageframe_group(const char* msg) ;
-
-		/**
-		 * Handle the insertion of a new ImageFrameItem
-		 *
-		 * @param msg the received message
-		 */
-		void handle_insert_imageframe_view(const char* msg) ;
-
-		/**
-		 * Handle the insertion of a new MarkerItem
-		 *
-		 * @param msg the received message
-		 */
-		void handle_insert_marker_view(const char* msg) ;
-
-		//---------------------------------------------------------------------------------------//
-		// handlers for specific removal procedures
-
-		/**
-		 * Handle the removal of an ImageTimeAxis
-		 *
-		 * @param msg the received message
-		 */
-		void handle_remove_imageframe_time_axis(const char* msg) ;
-
-		/**
-		 * Handle the removal of an MarkerTimeAxis
-		 *
-		 * @param msg the received message
-		 */
-		void handle_remove_marker_time_axis(const char* msg) ;
-
-		/**
-		 * Handle the removal of an ImageFrameTimeAxisGroup
-		 *
-		 * @param msg the received message
-		 */
-		void handle_remove_imageframe_time_axis_group(const char* msg) ;
-
-		/**
-		 * Handle the removal of an ImageFrameItem
-		 *
-		 * @param msg the received message
-		 */
-		void handle_remove_imageframe_view(const char* msg) ;
-
-		/**
-		 * Handle the removal of an MarkerItem
-		 *
-		 * @param msg the received message
-		 */
-		void handle_remove_marker_view(const char* msg) ;
-
-		//---------------------------------------------------------------------------------------//
-		// handlers for the specific rename procedures
-
-		/**
-		 * Handle the renaming of an ImageTimeAxis
-		 *
-		 * @param msg the received message
-		 */
-		void handle_rename_imageframe_time_axis(const char* msg) ;
-
-		/**
-		 * Handle the renaming of an MarkerTimeAxis
-		 *
-		 * @param msg the received message
-		 */
-		void handle_rename_marker_time_axis(const char* msg) ;
-
-		/**
-		 * Handle the renaming of an ImageFrameItem
-		 *
-		 * @param msg the received message
-		 */
-		void handle_rename_imageframe_time_axis_group(const char* msg) ;
-
-		/**
-		 * Handle the renaming of an ImageFrameItem
-		 *
-		 * @param msg the received message
-		 */
-		void handle_rename_imageframe_view(const char* msg) ;
-
-		/**
-		 * Handle the renaming of an Marker
-		 *
-		 * @param msg the received message
-		 */
-		void handle_rename_marker_view(const char* msg) ;
-
-		//---------------------------------------------------------------------------------------//
-		// handlers for data request
-
-		/**
-	 	 * Handle a request for the sessnio naem fo the current session
-		 * We return a failure state if no session is open
-		 *
-		 * @param msg the received message
-		 */
-		void handle_session_name_request(const char* msg) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// handlers for specific item update changes
-
-		/**
-		 * Handle ImageFrameView positional changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_imageframe_view_position_update(const char* msg) ;
-
-		/**
-		 * Handle ImageFrameView Duration changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_imageframe_view_duration_update(const char* msg) ;
-
-		/**
-		 * Handle ImageFrameView Position Lock Constraint changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_imageframe_position_lock_update(const char* msg) ;
-
-		/**
-		 * Handle ImageFrameView Maximum Duration changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_imageframe_view_max_duration_update(const char* msg) ;
-
-		/**
-		 * Handle image frame max duration enable constraint changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_imageframe_view_max_duration_enable_update(const char* msg) ;
-
-		/**
-		 * Handle ImageFrameView Minimum Duration changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_imageframe_view_min_duration_update(const char* msg) ;
-
-		/**
-		 * Handle image frame min duration enable constraint changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_imageframe_view_min_duration_enable_update(const char* msg) ;
-
-
-		/**
-		 * Handle MarkerView position changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_marker_view_position_update(const char* msg) ;
-
-		/**
-		 * Handle MarkerView duration changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_marker_view_duration_update(const char* msg) ;
-
-		/**
-		 * Handle MarkerView Position Lock Constraint changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_marker_view_position_lock_update(const char* msg) ;
-
-		/**
-		 * Handle MarkerView maximum duration changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_marker_view_max_duration_update(const char* msg) ;
-
-		/**
-		 * Handle MarkerView minimum duration changes
-		 *
-		 * @param msg the received message
-		 */
-		void handle_marker_view_min_duration_update(const char* msg) ;
-
-
-
-		//---------------------------------------------------------------------------------------//
-		// handlers for Session Actions
-
-		/**
-		 * Handle the opening of a named audio session
-		 *
-		 * @param msg the received message
-		 */
-		void handle_open_session(const char* msg) ;
-
-		/**
-		 * Handle the closing of a named audio session
-		 *
-		 * @param msg the received message
-		 */
-		void handle_closed_session(const char* msg) ;
-
-		//---------------------------------------------------------------------------------------//
-		// handlers for the shutdown of the Image Compositor
-
-		/**
-		 * Handle the shutdown message from the image compositor
-		 *
-		 * @param msg the received message
-		 */
-		void handle_shutdown(const char* msg) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// convenince methods to break up messages
-
-		/**
-		 * Returns part of the received message as a std::string
-		 *
-		 * @param start the start character
-		 * @param num_chars the number of characters to read
-		 * @param the message to break apart
-		 * @return the sub std::string of the message
-		 */
-		std::string get_message_part(int start, int32_t num_chars, const char* msg) ;
-
-
-		/**
-		 * break up am image item description message
-		 * we break the mesage up into the parent Image Track id and size,
-		 * the parent group id and size, and the image id and size
-		 *
-		 * @param track_id
-		 * @param track_id_size
-		 * @param scene_id
-		 * @param scene_id_size
-		 * @param item_id
-		 * @param item_id_size
-		 */
-		void decompose_imageframe_item_desc(const char* msg, int& position, std::string& track_id, int& track_id_size, std::string& scene_id, int& scene_id_size, std::string& item_id, int& item_id_size) ;
-
-		/**
-		 * Compose a description of the specified image frame view
-		 * The description consists of the parent track name size and name,
-		 * the parent group name size and name, and the item name size and name
-		 *
-		 * @param ifv the item to compose a description of
-		 * @param buffer the buffer to write the description
-		 */
-		void compose_imageframe_item_desc(ImageFrameView* ifv, std::ostringstream& buffer) ;
-
-		/**
-		 * Compose a description of the specified marker view
-		 * The description consists of the parent track name size and name,
-		 * and the item name size and name
-		 *
-		 * @param mv the item to compose a description of
-		 * @param buffer the buffer to write the description
-		 */
-		void compose_marker_item_desc(MarkerView* mv, std::ostringstream& buffer) ;
-
-
-		/**
-		 * Returns the ImageFrameView from the specified description
-		 * The errcode parameter is used to indicate the item which caused
-		 * an error on failure of this method
-		 * 0 = suces
-		 * 1 = the track item was not found
-		 * 2 = the group item was not found
-		 * 3 = the imageframe item was not found
-		 *
-		 * @paran track_id the track on which the item is placed
-		 * @param group_id the group in which the item is a member
-		 * @param item_id the id of the item
-		 * @param int32_t reference used for error codes on failure
-		 * @param errmsg populated with a description of the error on failure
-		 * @return the described item on success, 0 otherwise
-		 */
-		ImageFrameView* get_imageframe_view_from_desc(const std::string & track_id, const std::string & group_ud, const std::string & item_id, int& errcode, std::string& errmsg) ;
-
-		//---------------------------------------------------------------------------------------//
-		// Convenince Message Send Methods
-
-		/**
-		 * Sends a message throught the socket
-		 *
-		 * @param msg the message to send
-		 * @return the return value of the socket call
-		 */
-		int send_message(const std::string & msg) ;
-
-		/**
-		 * Reads a message from the Socket
-		 *
-		 * @param msg a std::string to populate with the received message
-		 * @return the return value from the socket call
-		 */
-		int read_message(std::string& msg) ;
-
-		/**
-		 * Convenience method to compose and send a success messasge back to the Image Compositor
-		 *
-		 */
-		void send_return_success() ;
-
-		/**
-		 * Convenience method to compose and send a failure messasge back to the Image Compositor
-		 *
-		 * @param msg the failure message
-		 */
-		void send_return_failure(const std::string& msg) ;
-
-		//---------------------------------------------------------------------------------------//
-		// Memebr Data
-
-		/** Our instance of the socket handler, singleton */
-		static ImageFrameSocketHandler* _instance ;
-
-		/** The Ardour PublicEditor */
-		PublicEditor& thePublicEditor ;
-
-		/** the socket file descriptor */
-		int theArdourToCompositorSocket ;
-
-		/** This stores the 'tag' returned from gdk_input_add, which is required for removing the input */
-		int theGdkInputTag ;
-
-} ; /* class ImageFrameSocketHandler */
-
-#endif /* __ardour_gtk_imageframe_socket_handler_h__ */
diff --git a/gtk2_ardour/imageframe_time_axis.cc b/gtk2_ardour/imageframe_time_axis.cc
deleted file mode 100644
index 3b3d9bf..0000000
--- a/gtk2_ardour/imageframe_time_axis.cc
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
-    Copyright (C) 2003 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 <algorithm>
-
-#include "pbd/error.h"
-
-#include <gtkmm/menu.h>
-
-#include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/gtk_ui.h>
-
-#include "ardour/session.h"
-#include "ardour/utils.h"
-
-#include "public_editor.h"
-#include "imageframe_time_axis.h"
-#include "simplerect.h"
-#include "enums.h"
-#include "imageframe_time_axis_view.h"
-#include "imageframe_time_axis_group.h"
-#include "marker_time_axis_view.h"
-#include "imageframe_view.h"
-#include "marker_time_axis.h"
-#include "marker_view.h"
-#include "gui_thread.h"
-#include "canvas_impl.h"
-
-#include "i18n.h"
-
-using namespace ARDOUR;
-using namespace PBD;
-using namespace Gtk;
-
-/**
- * Constructs a new ImageFrameTimeAxis.
- *
- * @param track_id the track name/id
- * @param ed the PublicEditor
- * @param sess the current session
- * @param canvas the parent canvas item
- */
-ImageFrameTimeAxis::ImageFrameTimeAxis(const string & track_id, PublicEditor& ed, ARDOUR::Session* sess, ArdourCanvas::Canvas& canvas)
-	: AxisView(sess),
-	  VisualTimeAxis(track_id, ed, sess, canvas)
-{
-	_color = unique_random_color() ;
-
-	selection_group = new ArdourCanvas::Group (*canvas_display);
-	selection_group->hide();
-
-	// intialize our data items
-	y_position = -1 ;
-
-	/* create our new image frame view */
-	view = new ImageFrameTimeAxisView(*this) ;
-
-	/* create the Image Frame Edit Menu */
-	create_imageframe_menu() ;
-
-	// set the initial time axis text label
-	label_view() ;
-
-	// set the initial height of this time axis
-	set_height(hNormal) ;
-
-	TimeAxisView::CatchDeletion.connect (*this, boost::bind (&ImageFrameTimeAxis::remove_time_axis_view, this, _1), gui_context());
-}
-
-/**
- * Destructor
- * Responsible for destroying any child image items that may have been added to thie time axis
- */
-ImageFrameTimeAxis::~ImageFrameTimeAxis ()
-{
-	CatchDeletion (this);
-
-	// Destroy all the marker views we may have associaited with this TimeAxis
-	for(MarkerTimeAxisList::iterator iter = marker_time_axis_list.begin(); iter != marker_time_axis_list.end(); ++iter)
-	{
-		MarkerTimeAxis* mta = *iter ;
-		MarkerTimeAxisList::iterator next = iter ;
-		next++ ;
-
-		marker_time_axis_list.erase(iter) ;
-
-		delete mta ;
-		mta = 0 ;
-
-		iter = next ;
-	}
-
-	delete image_action_menu ;
-	image_action_menu = 0 ;
-
-	delete selection_group;
-	selection_group = 0 ;
-
-	// Destroy our Axis View helper
-	delete view ;
-	view = 0 ;
-}
-
-//---------------------------------------------------------------------------------------//
-// ui methods & data
-
-/**
- * Sets the height of this TrackView to one of ths TrackHeghts
- *
- * @param h
- */
-void
-ImageFrameTimeAxis::set_height (uint32_t h)
-{
-	VisualTimeAxis::set_height(h) ;
-
-	// tell out view helper of the change too
-	if(view != 0)
-	{
-		view->set_height((double) height) ;
-	}
-
-	// tell those interested that we have had our height changed
-	gui_changed("track_height",(void*)0); /* EMIT_SIGNAL */
-}
-
-/**
- * Sets the number of samples per unit that are used.
- * This is used to determine the siezes of items upon this time axis
- *
- * @param spu the number of samples per unit
- */
-void
-ImageFrameTimeAxis::set_samples_per_unit(double spu)
-{
-	TimeAxisView::set_samples_per_unit (editor.get_current_zoom());
-
-	if(view) {
-		view->set_samples_per_unit(spu) ;
-	}
-}
-
-
-/**
- * Returns the available height for images to be drawn onto
- *
- * @return the available height for an image item to be drawn onto
- */
-int
-ImageFrameTimeAxis::get_image_display_height()
-{
-	return(height - (gint)TimeAxisViewItem::NAME_HIGHLIGHT_SIZE) ;
-}
-
-
-/**
- * Show the popup edit menu
- *
- * @param button the mouse button pressed
- * @param time when to show the popup
- * @param clicked_imageframe the ImageFrameItem that the event ocured upon, or 0 if none
- * @param with_item true if an item has been selected upon the time axis, used to set context menu
- */
-void
-ImageFrameTimeAxis::popup_imageframe_edit_menu(int button, int32_t time, ImageFrameView* clicked_imageframe, bool with_item)
-{
-	if (!imageframe_menu)
-	{
-		create_imageframe_menu() ;
-	}
-
-	if(with_item)
-	{
-		imageframe_item_menu->set_sensitive(true) ;
-	}
-	else
-	{
-		imageframe_item_menu->set_sensitive(false) ;
-	}
-
-	imageframe_menu->popup(button,time) ;
-}
-
-/**
- * convenience method to select a new track color and apply it to the view and view items
- *
- */
-void
-ImageFrameTimeAxis::select_track_color()
-{
-	if (choose_time_axis_color())
-	{
-		if (view)
-		{
-			view->apply_color (_color) ;
-		}
-	}
-}
-
-/**
- * Handles the building of the popup menu
- */
-void
-ImageFrameTimeAxis::build_display_menu()
-{
-	using namespace Menu_Helpers;
-	using Gtk::Menu;
-
-	/* get the size menu ready */
-
-	build_size_menu();
-
-	/* prepare it */
-
-	TimeAxisView::build_display_menu () ;
-
-	/* now fill it with our stuff */
-
-	MenuList& items = display_menu->items();
-
-	items.push_back (MenuElem (_("Rename"), sigc::mem_fun(*this, &ImageFrameTimeAxis::start_time_axis_rename)));
-
-	image_action_menu = new Menu() ;
-	image_action_menu->set_name ("ArdourContextMenu");
-	MenuList image_items = image_action_menu->items() ;
-
-	items.push_back (SeparatorElem());
-	items.push_back (MenuElem (_("Height"), *size_menu));
-	items.push_back (MenuElem (_("Color"), sigc::mem_fun(*this, &ImageFrameTimeAxis::select_track_color)));
-
-	items.push_back (SeparatorElem());
-	items.push_back (MenuElem (_("Remove"), sigc::bind(sigc::mem_fun(*this, &VisualTimeAxis::remove_this_time_axis), (void*)this))) ;
-}
-
-/**
- * handles the building of the ImageFrameView sub menu
- */
-void
-ImageFrameTimeAxis::create_imageframe_menu()
-{
-	using namespace Menu_Helpers;
-	using Gtk::Menu;
-
-	imageframe_menu = manage(new Menu) ;
-	imageframe_menu->set_name ("ArdourContextMenu");
-	MenuList& items = imageframe_menu->items();
-
-	imageframe_item_menu = manage(new Menu) ;
-	imageframe_item_menu->set_name ("ArdourContextMenu");
-	MenuList& imageframe_sub_items = imageframe_item_menu->items() ;
-
-	/* duration menu */
-	Menu* duration_menu = manage(new Menu) ;
-	duration_menu->set_name ("ArdourContextMenu");
-	MenuList& duration_items = duration_menu->items() ;
-
-	if(view)
-	{
-		duration_items.push_back(MenuElem (_("0.5 seconds"), sigc::bind (sigc::mem_fun (view, &ImageFrameTimeAxisView::set_imageframe_duration_sec), 0.5))) ;
-		duration_items.push_back(MenuElem (_("1 seconds"), sigc::bind (sigc::mem_fun (view, &ImageFrameTimeAxisView::set_imageframe_duration_sec), 1.0))) ;
-		duration_items.push_back(MenuElem (_("1.5 seconds"), sigc::bind (sigc::mem_fun (view, &ImageFrameTimeAxisView::set_imageframe_duration_sec), 1.5))) ;
-		duration_items.push_back(MenuElem (_("2 seconds"), sigc::bind (sigc::mem_fun (view, &ImageFrameTimeAxisView::set_imageframe_duration_sec), 2.0))) ;
-		duration_items.push_back(MenuElem (_("2.5 seconds"), sigc::bind (sigc::mem_fun (view, &ImageFrameTimeAxisView::set_imageframe_duration_sec), 2.5))) ;
-		duration_items.push_back(MenuElem (_("3 seconds"), sigc::bind (sigc::mem_fun (view, &ImageFrameTimeAxisView::set_imageframe_duration_sec), 3.0))) ;
-		//duration_items.push_back(SeparatorElem()) ;
-		//duration_items.push_back(MenuElem (_("custom"), sigc::mem_fun(*this, &ImageFrameTimeAxis::set_imageframe_duration_custom))) ;
-	}
-
-	imageframe_sub_items.push_back(MenuElem(_("Duration (sec)"), *duration_menu)) ;
-
-	imageframe_sub_items.push_back(SeparatorElem()) ;
-	if(view)
-	{
-		imageframe_sub_items.push_back(MenuElem (_("Remove Frame"), sigc::bind(sigc::mem_fun (view, &ImageFrameTimeAxisView::remove_selected_imageframe_item), (void*)this))) ;
-	}
-
-	items.push_back(MenuElem(_("Image Frame"), *imageframe_item_menu)) ;
-	items.push_back(MenuElem (_("Rename Track"), sigc::mem_fun(*this,&ImageFrameTimeAxis::start_time_axis_rename))) ;
-
-	imageframe_menu->show_all() ;
-}
-
-
-
-
-//---------------------------------------------------------------------------------------//
-// Marker Time Axis Methods
-
-/**
- * Add a MarkerTimeAxis to the ilst of MarkerTimeAxis' associated with this ImageFrameTimeAxis
- *
- * @param marker_track the MarkerTimeAxis to add
- * @param src the identity of the object that initiated the change
- * @return true if the addition was a success,
- *         false otherwise
- */
-bool
-ImageFrameTimeAxis::add_marker_time_axis(MarkerTimeAxis* marker_track, void* src)
-{
-	bool ret = false ;
-
-	if(get_named_marker_time_axis(marker_track->name()) != 0)
-	{
-		ret = false ;
-	}
-	else
-	{
-		marker_time_axis_list.push_back(marker_track) ;
-		 MarkerTimeAxisAdded(marker_track, src) ; /* EMIT_SIGNAL */
-		ret = true ;
-	}
-
-	return(ret) ;
-}
-
-/**
- * Returns the named MarkerTimeAxis associated with this ImageFrameTimeAxis
- *
- * @param track_id the track_id of the MarkerTimeAxis to search for
- * @return the named markerTimeAxis, or 0 if the named MarkerTimeAxis is not associated with this ImageFrameTimeAxis
- */
-MarkerTimeAxis*
-ImageFrameTimeAxis::get_named_marker_time_axis(const string & track_id)
-{
-	MarkerTimeAxis* mta =  0 ;
-
-	for (MarkerTimeAxisList::iterator i = marker_time_axis_list.begin(); i != marker_time_axis_list.end(); ++i)
-	{
-		if (((MarkerTimeAxis*)*i)->name() == track_id)
-		{
-			mta = ((MarkerTimeAxis*)*i) ;
-			break ;
-		}
-	}
-	return(mta) ;
-}
-
-/**
- * Removes the named markerTimeAxis from those associated with this ImageFrameTimeAxis
- *
- * @param track_id the track id of the MarkerTimeAxis to remove
- * @param src the identity of the object that initiated the change
- * @return the removed MarkerTimeAxis
- */
-MarkerTimeAxis*
-ImageFrameTimeAxis::remove_named_marker_time_axis(const string & track_id, void* src)
-{
-	MarkerTimeAxis* mta = 0 ;
-
-	for(MarkerTimeAxisList::iterator i = marker_time_axis_list.begin(); i != marker_time_axis_list.end(); ++i)
-	{
-		if (((MarkerTimeAxis*)*i)->name() == track_id)
-		{
-			mta = ((MarkerTimeAxis*)*i) ;
-
-			// the iterator is invalid after this call, so we can no longer use it as is.
-			marker_time_axis_list.erase(i) ;
-
-			 MarkerTimeAxisRemoved(mta->name(), src) ; /* EMIT_SIGNAL */
-			break ;
-		}
-	}
-
-	return(mta) ;
-}
-
-/**
- * Removes the specified MarkerTimeAxis from the list of MarkerTimaAxis associated with this ImageFrameTimeAxis
- * Note that the MarkerTimeAxis is not deleted, only removed from the list os associated tracks
- *
- * @param mta the TimeAxis to remove
- * @param src the identity of the object that initiated the change
- */
-void
-ImageFrameTimeAxis::remove_time_axis_view (TimeAxisView* tav)
-{
-	MarkerTimeAxisView* mtav = dynamic_cast<MarkerTimeAxisView*> (tav);
-
-	if (!mtav) {
-		return;
-	}
-
-	MarkerTimeAxisList::iterator i;
-
-	if ((i = find (marker_time_axis_list.begin(), marker_time_axis_list.end(), mta)) != marker_time_axis_list.end())  {
-		// note that we dont delete the object itself, we just remove it from our list
-		marker_time_axis_list.erase(i) ;
-		MarkerTimeAxisRemoved (mta->name(), src) ; /* EMIT_SIGNAL */
-	}
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Parent/Child helper object accessors
-
-/**
- * Returns the view helper of this TimeAxis
- *
- * @return the view helper of this TimeAxis
- */
-ImageFrameTimeAxisView*
-ImageFrameTimeAxis::get_view()
-{
-	return(view) ;
-}
diff --git a/gtk2_ardour/imageframe_time_axis.h b/gtk2_ardour/imageframe_time_axis.h
deleted file mode 100644
index 52c2f73..0000000
--- a/gtk2_ardour/imageframe_time_axis.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
-    Copyright (C) 2003 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_imageframe_time_axis_h__
-#define __ardour_imageframe_time_axis_h__
-
-#include <list>
-
-//#include <libgnomecanvas.h>
-
-#include "ardour_dialog.h"
-#include "enums.h"
-#include "time_axis_view.h"
-#include "canvas.h"
-#include "visual_time_axis.h"
-
-namespace ARDOUR
-{
-	class Session ;
-}
-namespace Gtk {
-	class Menu;
-}
-
-class PublicEditor ;
-class ImageFrameView ;
-class ImageFrameTimeAxisView ;
-class MarkersTimeAxisView ;
-class MarkerTimeAxis;
-
-/**
- * ImageFrameTimeAxis defines a visual time axis view for holding and arranging image items.
- *
- */
-class ImageFrameTimeAxis : public VisualTimeAxis
-{
-	public:
-		//---------------------------------------------------------------------------------------//
-		// Constructor / Desctructor
-
-		/**
-		 * Constructs a new ImageFrameTimeAxis.
-		 *
-		 * @param track_id the track name/id
-		 * @param ed the PublicEditor
-		 * @param sess the current session
-		 * @param canvas the parent canvas item
-		 */
-		ImageFrameTimeAxis(const std::string & track_id, PublicEditor& ed, ARDOUR::Session* sess, ArdourCanvas::Canvas& canvas) ;
-
-		/**
-		 * Destructor
-		 * Responsible for destroying any child image items that may have been added to thie time axis
-		 */
-		virtual ~ImageFrameTimeAxis() ;
-
-		//---------------------------------------------------------------------------------------//
-		// ui methods & data
-
-		/**
-		 * Sets the height of this TrackView to one of ths TrackHeghts
-		 *
-		 * @param h the number of pixels to set the height too
-		 */
-		virtual void set_height(uint32_t h) ;
-
-		/**
-		 * Sets the number of samples per unit that are used.
-		 * This is used to determine the siezes of items upon this time axis
-		 *
-		 * @param spu the number of samples per unit
-		 */
-		virtual void set_samples_per_unit(double spu) ;
-
-		/**
-		 * Returns the available height for images to be drawn onto
-		 *
-		 * @return the available height for an image item to be drawn onto
-		 */
-		int get_image_display_height() ;
-
-
-		/**
-		 * Show the popup edit menu
-		 *
-		 * @param button the mouse button pressed
-		 * @param time when to show the popup
-		 * @param clicked_imageframe the ImageFrameItem that the event ocured upon, or 0 if none
-		 * @param with_item true if an item has been selected upon the time axis, used to set context menu
-		 */
-		void popup_imageframe_edit_menu(int button, int32_t time, ImageFrameView* clicked_imageframe, bool with_item) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Marker Time Axis Methods
-
-		/**
-		 * Add a MarkerTimeAxis to the ilst of MarkerTimeAxis' associated with this ImageFrameTimeAxis
-		 *
-		 * @param marker_track the MarkerTimeAxis to add
-		 * @param src the identity of the object that initiated the change
-		 * @return true if the addition was a success,
-		 *         false otherwise
-		 */
-		bool add_marker_time_axis(MarkerTimeAxis* marker_track, void* src) ;
-
-		/**
-		 * Returns the named MarkerTimeAxis associated with this ImageFrameTimeAxis
-		 *
-		 * @param track_id the track_id of the MarkerTimeAxis to search for
-		 * @return the named markerTimeAxis, or 0 if the named MarkerTimeAxis is not associated with this ImageFrameTimeAxis
-		 */
-		MarkerTimeAxis* get_named_marker_time_axis(const std::string & track_id) ;
-
-		/**
-		 * Removes the named markerTimeAxis from those associated with this ImageFrameTimeAxis
-		 *
-		 * @param track_id the track id of the MarkerTimeAxis to remove
-		 * @param src the identity of the object that initiated the change
-		 * @return the removed MarkerTimeAxis
-		 */
-		MarkerTimeAxis* remove_named_marker_time_axis(const std::string & track_id, void* src) ;
-
-		/**
-		 * Potentially removes a MarkerTimeAxisView from the list of MarkerTimaAxis associated with this ImageFrameTimeAxis
-		 *
-		 * @param tav the TimeAxis to remove
-		 * @param src the identity of the object that initiated the change
-		 */
-		void remove_time_axis_view (TimeAxisView* av);
-
-
-		//---------------------------------------------------------------------------------------//
-		// Parent/Child helper object accessors
-
-		/**
-		 * Returns the view helper of this TimeAxis
-		 *
-		 * @return the view helper of this TimeAxis
-		 */
-		ImageFrameTimeAxisView* get_view() ;
-
-
-		//---------------------------------------------------------------------------------//
-		// Emitted Signals
-
-		/** Emitted when a Marker Time Axis is Added, or associated with, this time axis */
-		sigc::signal<void,MarkerTimeAxis*,void*> MarkerTimeAxisAdded ;
-
-		/** Emitted when a Marker Time Axis is removed, from this time axis */
-		sigc::signal<void,std::string,void*> MarkerTimeAxisRemoved ;
-
-	protected:
-
-	private:
-		/**
-		 * convenience method to select a new track color and apply it to the view and view items
-		 *
-		 */
-		void select_track_color() ;
-
-		/**
-		 * Handles the building of the popup menu
-		 */
-		virtual void build_display_menu() ;
-
-		/**
-		 * handles the building of the ImageFrameView sub menu
-		 */
-		void create_imageframe_menu() ;
-
-  		/* We may have multiple marker views, but each marker view should only be associated with one timeaxisview */
-		typedef std::list<MarkerTimeAxis*> MarkerTimeAxisList ;
-		MarkerTimeAxisList marker_time_axis_list;
-
-		/* the TimeAxis view helper */
-		ImageFrameTimeAxisView *view ;
-
-		// popup menu widgets
-		Gtk::Menu *image_action_menu ;
-		Gtk::Menu *imageframe_menu ;
-		Gtk::Menu *imageframe_item_menu ;
-
-}; /* class ImageFrameTimeAxis */
-
-#endif /* __ardour_imageframe_time_axis_h__ */
-
diff --git a/gtk2_ardour/imageframe_time_axis_group.cc b/gtk2_ardour/imageframe_time_axis_group.cc
deleted file mode 100644
index c42452b..0000000
--- a/gtk2_ardour/imageframe_time_axis_group.cc
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
-    Copyright (C) 2003 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 <algorithm>
-
-#include <gtkmm.h>
-#include <gtkmm2ext/gtk_ui.h>
-
-#include "imageframe_time_axis_group.h"
-#include "imageframe_time_axis_view.h"
-#include "imageframe_view.h"
-#include "imageframe_time_axis.h"
-#include "canvas-simplerect.h"
-#include "region_selection.h"
-#include "public_editor.h"
-#include "gui_thread.h"
-
-#include "i18n.h"
-
-using namespace ARDOUR;
-
-PBD::Signal1<void,ImageFrameTimeAxisGroup*> ImageFrameTimeAxisGroup::CatchDeletion;
-
-//---------------------------------------------------------------------------------------//
-// Constructor / Desctructor
-
-/**
- * Constructs a new ImageFrameTimeAxisGroup.
- *
- * @param iftav the parent ImageFrameTimeAxis of this view helper
- * @param group_id the unique name/id of this group
- */
-ImageFrameTimeAxisGroup::ImageFrameTimeAxisGroup(ImageFrameTimeAxisView& iftav, const string & group_id)
-	: _view_helper(iftav), _group_id(group_id)
-{
-	selected_imageframe_item = 0;
-	is_selected = false;
-
-	ImageFrameView::CatchDeletion.connect (*this, boost::bind (&ImageFrameTimeAxisGroup::remove_imageframe_item, this, _1), gui_context());
-}
-
-/**
- * Destructor
- * Responsible for destroying any Items that may have been added to this group
- *
- */
-ImageFrameTimeAxisGroup::~ImageFrameTimeAxisGroup()
-{
-	// Destroy all the ImageFramViews that we have
-	for(ImageFrameViewList::iterator iter = imageframe_views.begin(); iter != imageframe_views.end(); ++iter)
-	{
-		ImageFrameView* ifv = *iter;
-
-		ImageFrameViewList::iterator next = iter;
-		next++;
-
-		imageframe_views.erase(iter);
-
-		delete ifv;
-		ifv = 0;
-
-		iter = next;
-	}
-
-	 CatchDeletion; /* EMIT_SIGNAL */
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Name/Id Accessors/Mutators
-
-/**
- * Set the name/Id of this group.
- *
- * @param new_name the new name of this group
- * @param src the identity of the object that initiated the change
- */
-void
-ImageFrameTimeAxisGroup::set_group_name(const string & new_name, void* src)
-{
-	if(_group_id != new_name)
-	{
-		std::string temp_name = _group_id;
-		_group_id = new_name;
-		 NameChanged(_group_id, temp_name, src); /* EMIT_SIGNAL */
-	}
-}
-
-/**
- * Returns the id of this group
- * The group id must be unique upon a time axis
- *
- * @return the id of this group
- */
-std::string
-ImageFrameTimeAxisGroup::get_group_name() const
-{
-	return(_group_id);
-}
-
-
-//---------------------------------------------------------------------------------------//
-// ui methods & data
-
-/**
- * Sets the height of the time axis view and the item upon it
- *
- * @param height the new height
- */
-int
-ImageFrameTimeAxisGroup::set_item_heights(gdouble h)
-{
-	/* limit the values to something sane-ish */
-	if (h < 10.0 || h > 1000.0)
-	{
-		return(-1);
-	}
-
-	// set the heights of all the imaeg frame views within the group
-	for(ImageFrameViewList::const_iterator citer = imageframe_views.begin(); citer != imageframe_views.end(); ++citer)
-	{
-		(*citer)->set_height(h);
-	}
-
-	return(0);
-}
-
-/**
- * Sets the current samples per unit.
- * this method tells each item upon the time axis of the change
- *
- * @param spu the new samples per canvas unit value
- */
-int
-ImageFrameTimeAxisGroup::set_item_samples_per_units(gdouble spp)
-{
-	if(spp < 1.0)
-	{
-		return(-1);
-	}
-
-	for(ImageFrameViewList::const_iterator citer = imageframe_views.begin(); citer != imageframe_views.end(); ++citer)
-	{
-		(*citer)->set_samples_per_unit(spp);
-	}
-
-	return(0);
-}
-
-/**
- * Sets the color of the items contained uopn this view helper
- *
- * @param color the new base color
- */
-void
-ImageFrameTimeAxisGroup::apply_item_color(Gdk::Color& color)
-{
-	region_color = color;
-	for(ImageFrameViewList::const_iterator citer = imageframe_views.begin(); citer != imageframe_views.end(); citer++)
-	{
-		(*citer)->set_color (region_color);
-	}
-}
-
-
-
-//---------------------------------------------------------------------------------------//
-// child ImageFrameView methods
-
-/**
- * Adds an ImageFrameView to the list of items upon this time axis view helper
- * the new ImageFrameView is returned
- *
- * @param item_id the unique id of the new item
- * @param image_id the id/name of the image data we are usin
- * @param start the position the new item should be placed upon the time line
- * @param duration the duration the new item should be placed upon the timeline
- * @param rgb_data the rgb data of the image
- * @param width the original image width of the rgb_data (not the size to display)
- * @param height the irigianl height of the rgb_data
- * @param num_channels the number of channles within the rgb_data
- * @param src the identity of the object that initiated the change
- */
-ImageFrameView*
-ImageFrameTimeAxisGroup::add_imageframe_item(const string & frame_id, framepos_t start, framecnt_t duration, unsigned char* rgb_data, uint32_t width, uint32_t height, uint32_t num_channels, void* src)
-{
-	ImageFrameView* ifv = 0;
-
-	//check that there is not already an imageframe with that id
-	if(get_named_imageframe_item(frame_id) == 0)
-	{
-		ifv = new ImageFrameView(frame_id,
-			_view_helper.canvas_item()->property_parent(),
-			&(_view_helper.trackview()),
-			this,
-			_view_helper.trackview().editor.get_current_zoom(),
-			region_color,
-			start,
-			duration,
-			rgb_data,
-			width,
-			height,
-			num_channels);
-
-		imageframe_views.push_front(ifv);
-		ImageFrameAdded(ifv, src); /* EMIT_SIGNAL */
-	}
-
-	return(ifv);
-}
-
-
-/**
- * Returns the named ImageFrameView or 0 if the named view does not exist on this view helper
- *
- * @param item_id the unique id of the item to search for
- * @return the named ImageFrameView, or 0 if it is not held upon this view
- */
-ImageFrameView*
-ImageFrameTimeAxisGroup::get_named_imageframe_item(const string & frame_id)
-{
-	ImageFrameView* ifv =  0;
-
-	for (ImageFrameViewList::const_iterator i = imageframe_views.begin(); i != imageframe_views.end(); ++i)
-	{
-		if (((ImageFrameView*)*i)->get_item_name() == frame_id)
-		{
-			ifv = ((ImageFrameView*)*i);
-			break;
-		}
-	}
-	return(ifv);
-}
-
-/**
- * Removes the currently selected ImageFrameView
- *
- * @param src the identity of the object that initiated the change
- * @todo need to remoev this, the selected item within group is no longer
- *       used in favour of a time axis selected item
- * @see add_imageframe_view
- */
-void
-ImageFrameTimeAxisGroup::remove_selected_imageframe_item(void* src)
-{
-	std::string frame_id;
-
-	if(selected_imageframe_item)
-	{
-		ImageFrameViewList::iterator i;
-
-		if((i = find(imageframe_views.begin(), imageframe_views.end(), selected_imageframe_item)) != imageframe_views.end())
-		{
-			imageframe_views.erase(i);
-			frame_id = selected_imageframe_item->get_item_name();
-
-			// note that we delete the item here
-			delete(selected_imageframe_item);
-			selected_imageframe_item = 0;
-
-			std::string track_id = _view_helper.trackview().name();
-			 ImageFrameRemoved(track_id, _group_id, frame_id, src); /* EMIT_SIGNAL */
-		}
-	}
-	else
-	{
-		//cerr << "No Selected ImageFrame" << endl;
-	}
-}
-
-
-/**
- * Removes and returns the named ImageFrameView from the list of ImageFrameViews held by this view helper
- *
- * @param item_id the ImageFrameView unique id to remove
- * @param src the identity of the object that initiated the change
- * @see add_imageframe_view
- */
-ImageFrameView*
-ImageFrameTimeAxisGroup::remove_named_imageframe_item(const string & frame_id, void* src)
-{
-	ImageFrameView* removed = 0;
-
-	for(ImageFrameViewList::iterator iter = imageframe_views.begin(); iter != imageframe_views.end(); ++iter)
-	{
-		ImageFrameView* tempItem = *iter;
-		if(tempItem->get_item_name() == frame_id)
-		{
-			removed = tempItem;
-			imageframe_views.erase(iter);
-
-			if (removed == selected_imageframe_item)
-			{
-				selected_imageframe_item = 0;
-			}
-
-			std::string track_id = _view_helper.trackview().name();
-			 ImageFrameRemoved(track_id, _group_id, frame_id, src); /* EMIT_SIGNAL */
-
-			// break from the for loop
-			break;
-		}
-		iter++;
-	}
-
-	return(removed);
-}
-
-/**
- * Removes ifv from the list of ImageFrameViews upon this TimeAxis.
- * if ifv is not upon this TimeAxis, this method takes no action
- *
- * @param ifv the ImageFrameView to remove
- */
-void
-ImageFrameTimeAxisGroup::remove_imageframe_item (ImageFrameView* ifv)
-{
-	ENSURE_GUI_THREAD (*this, &ImageFrameTimeAxisGroup::remove_imageframe_item, ifv, src)
-
-	ImageFrameViewList::iterator i;
-
-	if((i = find (imageframe_views.begin(), imageframe_views.end(), ifv)) != imageframe_views.end()) {
-		imageframe_views.erase(i);
-
-		std::string frame_id = ifv->get_item_name();
-		std::string track_id = _view_helper.trackview().name();
-		 ImageFrameRemoved(track_id, _group_id, frame_id, src); /* EMIT_SIGNAL */
-	}
-}
-
-//---------------------------------------------------------------------------------------//
-// Selected group methods
-
-/**
- * Sets the currently selected item upon this time axis
- *
- * @param ifv the item to set selected
- */
-//void
-//ImageFrameTimeAxisGroup::set_selected_imageframe_item(ImageFrameView* ifv)
-//{
-//	if(selected_imageframe_item)
-//	{
-//		selected_imageframe_item->set_selected(false, this);
-//	}
-//
-//	selected_imageframe_item = ifv;
-//
-//	if(!ifv->get_selected())
-//	{
-//		selected_imageframe_item->set_selected(true, this);
-//	}
-//}
-
-
-/**
- * Sets the currently selected item upon this time axis to the named item
- *
- * @param item_id the name/id of the item to set selected
- */
-//void
-//ImageFrameTimeAxisGroup::set_selected_imageframe_item(std::string frame_id)
-//{
-//	selected_imageframe_item = get_named_imageframe_item(frame_id);
-//}
-
-
-/**
- * Returns the currently selected item upon this time axis
- *
- * @return the currently selected item pon this time axis
- */
-// ImageFrameView*
-// ImageFrameTimeAxisGroup::get_selected_imageframe_item()
-// {
-	// return(selected_imageframe_item);
-// }
-
-
-
-/**
- * Returns whether this grou pis currently selected
- *
- * @returns true if this group is currently selected
- */
-bool
-ImageFrameTimeAxisGroup::get_selected() const
-{
-	return(is_selected);
-}
-
-
-/**
- * Sets he selected state of this group
- *
- * @param yn set true if this group is selected, false otherwise
- */
-void
-ImageFrameTimeAxisGroup::set_selected(bool yn)
-{
-	is_selected = yn;
-}
-
-
-
-//---------------------------------------------------------------------------------------//
-// Handle time axis removal
-
-/**
- * Handles the Removal of this VisualTimeAxis
- * This _needs_ to be called to alert others of the removal properly, ie where the source
- * of the removal came from.
- *
- * XXX Although im not too happy about this method of doing things, I cant think of a cleaner method
- *     just now to capture the source of the removal
- *
- * @param src the identity of the object that initiated the change
- */
-void
-ImageFrameTimeAxisGroup::remove_this_group(void* src)
-{
-	/*
-	   defer to idle loop, otherwise we'll delete this object
-	   while we're still inside this function ...
-	*/
-  	Glib::signal_idle().connect(sigc::bind(ptr_fun(&ImageFrameTimeAxisGroup::idle_remove_this_group), this, src));
-}
-
-/**
- * Callback used to remove this group during the gtk idle loop
- * This is used to avoid deleting the obejct while inside the remove_this_group
- * method
- *
- * @param group the ImageFrameTimeAxisGroup to remove
- * @param src the identity of the object that initiated the change
- */
-gint
-ImageFrameTimeAxisGroup::idle_remove_this_group(ImageFrameTimeAxisGroup* group, void* src)
-{
-	delete group;
-	group = 0;
-	 group->GroupRemoved(group->get_group_name(), src); /* EMIT_SIGNAL */
-	return(false);
-}
-
diff --git a/gtk2_ardour/imageframe_time_axis_group.h b/gtk2_ardour/imageframe_time_axis_group.h
deleted file mode 100644
index c1ec26e..0000000
--- a/gtk2_ardour/imageframe_time_axis_group.h
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
-    Copyright (C) 2003 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_imageframe_time_axis_group_h__
-#define __ardour_imageframe_time_axis_group_h__
-
-#include <list>
-#include <cmath>
-
-#include <gdkmm/color.h>
-
-#include <libgnomecanvas/libgnomecanvas.h>
-#include <jack/jack.h>
-#include "ardour/types.h"
-#include "imageframe_time_axis_view.h"
-
-class PublicEditor ;
-class ImageFrameView ;
-
-/**
- * ImageFrameTimeAxisGroup defines a group/scene of ImageFrame view that can appear upon a time axis
- * At the moment this is a bit bare, we really want to add some kind of time constraints upon
- * items atht are added to the group, ie bounded by the start and end of the scene, which itself
- * needs fleshed out.
- * A viewable object may also be useful...
- *
- */
-class ImageFrameTimeAxisGroup : public sigc::trackable
-{
-	public:
-		//---------------------------------------------------------------------------------------//
-		// Constructor / Desctructor
-
-		/**
-		 * Constructs a new ImageFrameTimeAxisGroup.
-		 *
-		 * @param iftav the parent ImageFrameTimeAxis of this view helper
-		 * @param group_id the unique name/id of this group
-		 */
-		ImageFrameTimeAxisGroup(ImageFrameTimeAxisView& iftav, const std::string & group_id) ;
-
-		/**
-		 * Destructor
-		 * Responsible for destroying any Items that may have been added to this group
-		 *
-		 */
-		virtual ~ImageFrameTimeAxisGroup() ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Name/Id Accessors/Mutators
-
-		/**
-		 * Set the name/Id of this group.
-		 *
-		 * @param new_name the new name of this group
-		 * @param src the identity of the object that initiated the change
-		 */
-		void set_group_name(const std::string & new_name, void* src) ;
-
-		/**
-		 * Returns the id of this group
-		 * The group id must be unique upon a time axis
-		 *
-		 * @return the id of this group
-		 */
-		std::string get_group_name() const ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Parent/Child helper object accessors
-
-		/**
-		 * Returns the TimeAxisView thatt his object is acting as a helper for
-		 *
-		 * @return the TimeAxisView that this object is acting as a view helper for
-		 */
-		ImageFrameTimeAxisView& get_view() const { return _view_helper ; }
-
-
-
-		//---------------------------------------------------------------------------------------//
-		// ui methods & data
-
-		/**
-		 * Sets the height of the time axis view and the item upon it
-		 *
-		 * @param height the new height
-		 */
-		int set_item_heights(gdouble) ;
-
-		/**
-		 * Sets the current samples per unit.
-		 * this method tells each item upon the time axis of the change
-		 *
-		 * @param spu the new samples per canvas unit value
-		 */
-		int set_item_samples_per_units(gdouble spu) ;
-
-		/**
-		 * Sets the color of the items contained uopn this view helper
-		 *
-		 * @param color the new base color
-		 */
-		void apply_item_color(Gdk::Color&) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// child ImageFrameView methods
-
-		/**
-		 * Adds an ImageFrameView to the list of items upon this time axis view helper
-		 * the new ImageFrameView is returned
-		 *
-		 * @param item_id the unique id of the new item
-		 * @param image_id the id/name of the image data we are usin
-		 * @param start the position the new item should be placed upon the time line
-		 * @param duration the duration the new item should be placed upon the timeline
-		 * @param rgb_data the rgb data of the image
-		 * @param width the original image width of the rgb_data (not the size to display)
-		 * @param height the irigianl height of the rgb_data
-		 * @param num_channels the number of channles within the rgb_data
-		 * @param src the identity of the object that initiated the change
-		 */
-		ImageFrameView* add_imageframe_item(const std::string & item_id, nframes_t start, nframes_t duration, unsigned char* rgb_data, uint32_t width, uint32_t height, uint32_t num_channels, void* src) ;
-
-		/**
-		 * Returns the named ImageFrameView or 0 if the named view does not exist on this view helper
-		 *
-		 * @param item_id the unique id of the item to search for
-		 * @return the named ImageFrameView, or 0 if it is not held upon this view
-		 */
-		ImageFrameView* get_named_imageframe_item(const std::string & item_id) ;
-
-		/**
-		 * Removes the currently selected ImageFrameView
-		 *
-		 * @param src the identity of the object that initiated the change
-		 * @see add_imageframe_view
-		 */
-		void remove_selected_imageframe_item(void* src) ;
-
-		/**
-		 * Removes and returns the named ImageFrameView from the list of ImageFrameViews held by this view helper
-		 *
-		 * @param item_id the ImageFrameView unique id to remove
-		 * @param src the identity of the object that initiated the change
-		 * @see add_imageframe_view
-		 */
-		ImageFrameView* remove_named_imageframe_item(const std::string & item_id, void* src) ;
-
-		/**
-		 * Removes ifv from the list of ImageFrameViews upon this TimeAxis.
-		 * if ifv is not upon this TimeAxis, this method takes no action
-		 *
-		 * @param ifv the ImageFrameView to remove
-		 */
-		void remove_imageframe_item(ImageFrameView*, void* src) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Selected group methods
-
-
-		// removed in favour of a track level selectewd item
-		// this is simply easier to manage a singularly selected item, rather than
-		// a selected item within each group
-
-		/**
-		 * Sets the currently selected item upon this time axis
-		 *
-		 * @param ifv the item to set selected
-		 */
-		//void set_selected_imageframe_item(ImageFrameView* ifv) ;
-
-		/**
-		 * Sets the currently selected item upon this time axis to the named item
-		 *
-		 * @param item_id the name/id of the item to set selected
-		 */
-		//void set_selected_imageframe_item(std::string item_id) ;
-
-		/**
-		 * Returns the currently selected item upon this time axis
-		 *
-		 * @return the currently selected item pon this time axis
-		 */
-		//ImageFrameView* get_selected_imageframe_item() ;
-
-		/**
-		 * Returns whether this grou pis currently selected
-		 *
-		 * @returns true if this group is currently selected
-		 */
-		bool get_selected() const ;
-
-		/**
-		 * Sets he selected state of this group
-		 *
-		 * @param yn set true if this group is selected, false otherwise
-		 */
-		void set_selected(bool yn) ;
-
-		//---------------------------------------------------------------------------------------//
-		// Handle group removal
-
-		/**
-		 * Handles the Removal of this VisualTimeAxis
-		 * This _needs_ to be called to alert others of the removal properly, ie where the source
-		 * of the removal came from.
-		 *
-		 * XXX Although im not too happy about this method of doing things, I cant think of a cleaner method
-		 *     just now to capture the source of the removal
-		 *
-		 * @param src the identity of the object that initiated the change
-		 */
-		virtual void remove_this_group(void* src) ;
-
-		//---------------------------------------------------------------------------------//
-		// Emitted Signals
-
-		static sigc::signal<void,ImageFrameTimeAxisGroup*> CatchDeletion;
-
-		/**
-		 * Emitted when this Group has been removed
-		 * This is different to the CatchDeletion signal in that this signal
-		 * is emitted during the deletion of this Time Axis, and not during
-		 * the destructor, this allows us to capture the source of the deletion
-		 * event
-		 */
-		sigc::signal<void,std::string,void*> GroupRemoved ;
-
-		/** Emitted when we have changed the name of this TimeAxis */
-		sigc::signal<void,std::string,std::string,void*> NameChanged ;
-
-		/** Emitted when an ImageFrameView is added to this group */
-		sigc::signal<void, ImageFrameView*, void*> ImageFrameAdded ;
-
-		/** Emitted when an ImageFrameView is removed from this group */
-		sigc::signal<void, const std::string &, const std::string &, const std::string &, void*> ImageFrameRemoved ;
-
-	protected:
-
-
-	private:
-		/**
-		 * convenience method to re-get the samples per unit and tell items upon this view
-		 *
-		 */
-		void reset_samples_per_unit() ;
-
-		/**
-		 * Callback used to remove this group during the gtk idle loop
-		 * This is used to avoid deleting the obejct while inside the remove_this_group
-		 * method
-		 *
-		 * @param group the ImageFrameTimeAxisGroup to remove
-		 * @param src the identity of the object that initiated the change
-		 */
-		static gint idle_remove_this_group(ImageFrameTimeAxisGroup* group, void* src) ;
-
-		/** The list of ImageFrameViews held by this view helper */
-		typedef std::list<ImageFrameView *> ImageFrameViewList ;
-		ImageFrameViewList imageframe_views ;
-
-		/** the currently selected time axis item upon this time axis */
-		ImageFrameView* selected_imageframe_item ;
-
-		/** the view helper that this object is acting as a container upon on */
-		ImageFrameTimeAxisView& _view_helper ;
-
-		/** the is of this group */
-		std::string _group_id ;
-
-		/* XXX why are these different? */
-		Gdk::Color region_color ;
-		uint32_t stream_base_color ;
-
-		/** indicates if this group is currently selected */
-		bool is_selected ;
-
-} ; /* class ImageFrameTimeAxisGroup */
-
-#endif /* __ardour_imageframe_time_axis_group_h__ */
diff --git a/gtk2_ardour/imageframe_time_axis_view.cc b/gtk2_ardour/imageframe_time_axis_view.cc
deleted file mode 100644
index 8df7a91..0000000
--- a/gtk2_ardour/imageframe_time_axis_view.cc
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
-    Copyright (C) 2003 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 <algorithm>
-
-#include <gtkmm.h>
-
-#include <gtkmm2ext/gtk_ui.h>
-
-#include "imageframe_time_axis_view.h"
-#include "imageframe_time_axis_group.h"
-#include "imageframe_view.h"
-#include "imageframe_time_axis.h"
-#include "canvas-simplerect.h"
-#include "region_selection.h"
-#include "public_editor.h"
-#include "rgb_macros.h"
-#include "gui_thread.h"
-#include "ardour_ui.h"
-
-#include "i18n.h"
-
-using namespace ARDOUR ;
-using namespace Editing;
-
-//---------------------------------------------------------------------------------------//
-// Constructor / Desctructor
-
-/**
- * Constructs a new ImageFrameTimeAxisView.
- *
- * @param ifta the parent ImageFrameTimeAxis of this view helper
- */
-ImageFrameTimeAxisView::ImageFrameTimeAxisView (ImageFrameTimeAxis& tv)
-	: _trackview (tv),
-	  canvas_group (*_trackview.canvas_display),
-	  canvas_rect (canvas_group, 0.0, 0.0, 1000000.0, tv.current_height())
-{
-	region_color = _trackview.color() ;
-	stream_base_color = ARDOUR_UI::config()->canvasvar_ImageTrack.get() ;
-
-	canvas_rect.property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_ImageTrack.get();
-	canvas_rect.property_fill_color_rgba() = stream_base_color;
-
-	canvas_rect.signal_event().connect (sigc::bind (sigc::mem_fun (_trackview.editor, &PublicEditor::canvas_imageframe_view_event), (ArdourCanvas::Item*) &canvas_rect, &tv));
-
-	_samples_per_unit = _trackview.editor.get_current_zoom() ;
-
-	_trackview.editor.ZoomChanged.connect (sigc::mem_fun(*this, &ImageFrameTimeAxisView::reset_samples_per_unit)) ;
-
-	selected_imageframe_group = 0 ;
-	selected_imageframe_view = 0 ;
-
-	ImageFrameTimeAxisGroup::CatchDeletion.connect (*this, boost::bind (&ImageFrameTimeAxisView::remove_imageframe_group, this, _1), gui_context());
-}
-
-/**
- * Destructor
- * Responsible for destroying all items tat may have been added to this time axis
- */
-ImageFrameTimeAxisView::~ImageFrameTimeAxisView()
-{
-	// Destroy all the ImageFrameGroups that we have
-
-	for(ImageFrameGroupList::iterator iter = imageframe_groups.begin(); iter != imageframe_groups.end(); ++iter)
-	{
-		ImageFrameTimeAxisGroup* iftag = (*iter) ;
-
-		ImageFrameGroupList::iterator next = iter ;
-		next++ ;
-
-		// remove the front element
-		imageframe_groups.erase(iter) ;
-
-		delete iftag ;
-		iftag = 0 ;
-
-		iter = next ;
-	}
-
-}
-
-
-//---------------------------------------------------------------------------------------//
-// ui methods & data
-
-/**
- * Sets the height of the time axis view and the item upon it
- *
- * @param height the new height
- */
-int
-ImageFrameTimeAxisView::set_height (gdouble h)
-{
-	/* limit the values to something sane-ish */
-	if (h < 10.0 || h > 1000.0) {
-		return(-1) ;
-	}
-
-	canvas_rect.property_y2() = h ;
-
-
-	for(ImageFrameGroupList::const_iterator citer = imageframe_groups.begin(); citer != imageframe_groups.end(); ++citer)
-	{
-		(*citer)->set_item_heights(h) ;
-	}
-
-	return(0) ;
-}
-
-/**
- * Sets the position of this view helper on the canvas
- *
- * @param x the x position upon the canvas
- * @param y the y position npon the canvas
- */
-int
-ImageFrameTimeAxisView::set_position (gdouble x, gdouble y)
-
-{
-	canvas_group.property_x() = x;
-	canvas_group.property_y() = y;
-
-	return 0;
-}
-
-/**
- * Sets the current samples per unit.
- * this method tells each item upon the time axis of the change
- *
- * @param spu the new samples per canvas unit value
- */
-int
-ImageFrameTimeAxisView::set_samples_per_unit (gdouble spp)
-{
-	if (spp < 1.0) {
-		return(-1) ;
-	}
-
-	_samples_per_unit = spp;
-
-	for(ImageFrameGroupList::const_iterator citer = imageframe_groups.begin(); citer != imageframe_groups.end(); ++citer)
-	{
-		(*citer)->set_item_samples_per_units(spp) ;
-	}
-
-	return(0) ;
-}
-
-/**
- * Sets the color of the items contained uopn this view helper
- *
- * @param color the new base color
- */
-void
-ImageFrameTimeAxisView::apply_color(Gdk::Color& color)
-{
-	region_color = color ;
-	for(ImageFrameGroupList::const_iterator citer = imageframe_groups.begin(); citer != imageframe_groups.end(); citer++)
-	{
-		(*citer)->apply_item_color(region_color) ;
-	}
-}
-
-
-/**
- * convenience method to re-get the samples per unit and tell items upon this view
- *
- */
-void
-ImageFrameTimeAxisView::reset_samples_per_unit ()
-{
-	set_samples_per_unit (_trackview.editor.get_current_zoom());
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Child ImageFrameTimeAxisGroup Accessors/Mutators
-
-/**
- * Adds an ImageFrameTimeAxisGroup to the list of items upon this time axis view helper
- * the new ImageFrameTimeAxisGroup is returned
- *
- * @param group_id the unique id of the new group
- * @param src the identity of the object that initiated the change
- */
-ImageFrameTimeAxisGroup*
-ImageFrameTimeAxisView::add_imageframe_group(std::string group_id, void* src)
-{
-	ImageFrameTimeAxisGroup* iftag = 0 ;
-
-	//check that there is not already a group with that id
-	if(get_named_imageframe_group(group_id) != 0)
-	{
-		// iftag = 0 ;
-	}
-	else
-	{
-		iftag = new ImageFrameTimeAxisGroup(*this, group_id) ;
-		imageframe_groups.push_front(iftag) ;
-		ImageFrameGroupAdded(iftag, src) ; /* EMIT_SIGNAL */
-	}
-
-	return(iftag) ;
-}
-
-/**
- * Returns the named ImageFrameTimeAxisGroup or 0 if the named group does not exist on this view helper
- *
- * @param group_id the unique id of the group to search for
- * @return the named ImageFrameTimeAxisGroup, or 0 if it is not held upon this view
- */
-ImageFrameTimeAxisGroup*
-ImageFrameTimeAxisView::get_named_imageframe_group(std::string group_id)
-{
-	ImageFrameTimeAxisGroup* iftag =  0 ;
-
-	for(ImageFrameGroupList::iterator i = imageframe_groups.begin(); i != imageframe_groups.end(); ++i)
-	{
-		if (((ImageFrameTimeAxisGroup*)*i)->get_group_name() == group_id)
-		{
-			iftag = ((ImageFrameTimeAxisGroup*)*i) ;
-			break ;
-		}
-	}
-
-	return(iftag) ;
-}
-
-
-/**
- * Removes and returns the named ImageFrameTimeAxisGroup from the list of ImageFrameTimeAxisGroup held by this view helper
- *
- * @param group_id the ImageFrameTimeAxisGroup unique id to remove
- * @param src the identity of the object that initiated the change
- * @see add_imageframe_group
- */
-ImageFrameTimeAxisGroup*
-ImageFrameTimeAxisView::remove_named_imageframe_group(std::string group_id, void* src)
-{
-	ImageFrameTimeAxisGroup* removed = 0 ;
-
-	for(ImageFrameGroupList::iterator iter = imageframe_groups.begin(); iter != imageframe_groups.end(); ++iter)
-	{
-		if(((ImageFrameTimeAxisGroup*)*iter)->get_group_name() == group_id)
-		{
-			removed = (*iter) ;
-			imageframe_groups.erase(iter) ;
-
-			if(removed == selected_imageframe_group)
-			{
-				selected_imageframe_group = 0 ;
-			}
-
-			 ImageFrameGroupRemoved(removed->get_group_name(), src) ; /* EMIT_SIGNAL */
-
-			// break from the for loop
-			break ;
-		}
-		iter++ ;
-	}
-
-	return(removed) ;
-}
-
-
-/**
- * Removes the specified ImageFrameTimeAxisGroup from the list of ImageFrameTimeAxisGroups upon this TimeAxis.
- *
- * @param iftag the ImageFrameView to remove
- */
-void
-ImageFrameTimeAxisView::remove_imageframe_group(ImageFrameTimeAxisGroup* iftag, void* src)
-{
-	ENSURE_GUI_THREAD (*this, &ImageFrameTimeAxisView::remove_imageframe_group, iftag, src)
-
-	ImageFrameGroupList::iterator i;
-	if((i = find (imageframe_groups.begin(), imageframe_groups.end(), iftag)) != imageframe_groups.end())
-	{
-		imageframe_groups.erase(i) ;
-
-		 ImageFrameGroupRemoved(iftag->get_group_name(), src) ; /* EMIT_SIGNAL */
-	}
-}
-
-
-
-
-//---------------------------------------------------------------------------------------//
-// Selected group methods
-
-/**
- * Sets the currently selected group upon this time axis
- *
- * @param ifv the item to set selected
- */
-void
-ImageFrameTimeAxisView::set_selected_imageframe_group(ImageFrameTimeAxisGroup* iftag)
-{
-	if(selected_imageframe_group)
-	{
-		selected_imageframe_group->set_selected(false) ;
-	}
-
-	selected_imageframe_group = iftag ;
-	selected_imageframe_group->set_selected(true) ;
-}
-
-/**
- * Clears the currently selected image frame group unpo this time axis
- *
-*/
-void
-ImageFrameTimeAxisView::clear_selected_imageframe_group()
-{
-	if(selected_imageframe_group)
-	{
-		selected_imageframe_group->set_selected(false) ;
-	}
-	selected_imageframe_group = 0 ;
-}
-
-/**
- * Returns the currently selected group upon this time axis
- *
- * @return the currently selected group upon this time axis
- */
-ImageFrameTimeAxisGroup*
-ImageFrameTimeAxisView::get_selected_imageframe_group() const
-{
-	return(selected_imageframe_group) ;
-}
-
-//---------------------------------------------------------------------------------------//
-// Selected item methods
-
-/**
- * Sets the currently selected imag frame view item
- *
- * @param iftag the group the selected item is part
- * @param ifv the selected item
- */
-void
-ImageFrameTimeAxisView::set_selected_imageframe_view(ImageFrameTimeAxisGroup* iftag, ImageFrameView* ifv)
-{
-	set_selected_imageframe_group(iftag) ;
-
-	if(selected_imageframe_view)
-	{
-		selected_imageframe_view->set_selected(false) ;
-	}
-
-	selected_imageframe_view = ifv ;
-	selected_imageframe_view->set_selected(true) ;
-}
-
-/**
- * Clears the currently selected image frame view item
- *
- */
-void
-ImageFrameTimeAxisView::clear_selected_imageframe_item(bool clear_group)
-{
-	if(clear_group)
-	{
-		clear_selected_imageframe_group() ;
-	}
-
-	if(selected_imageframe_view)
-	{
-		selected_imageframe_view->set_selected(false) ;
-	}
-	selected_imageframe_view = 0 ;
-}
-
-/**
- * Returns the currently selected image frame view item upon this time axis
- *
- * @return the currently selected image frame view item
- */
-ImageFrameView*
-ImageFrameTimeAxisView::get_selected_imageframe_view() const
-{
-	return(selected_imageframe_view) ;
-}
-
-
-
-
-void
-ImageFrameTimeAxisView::set_imageframe_duration_sec(double sec)
-{
-	if (selected_imageframe_group && selected_imageframe_view) {
-		selected_imageframe_view->set_duration ((sec * _trackview.editor.session()->frame_rate()), this);
-	}
-}
-
-
-
-/**
- * Removes the currently selected ImageFrame view item
- *
- * @param src the identity of the object that initiated the change
- * @see add_imageframe_group
- */
-void
-ImageFrameTimeAxisView::remove_selected_imageframe_item(void* src)
-{
-	if(selected_imageframe_group && selected_imageframe_view)
-	{
-		ImageFrameView* temp_item = selected_imageframe_view ;
-		selected_imageframe_group->remove_imageframe_item(temp_item, src) ;
-
-		// XXX although we have removed the item from the group, we need the group id still set within the
-		//     item as the remove method requires this data when telling others about the deletion
-		//     to fully specify the item we need the track, group and item id
-		selected_imageframe_view->remove_this_item(src) ;
-		clear_selected_imageframe_item(false) ;
-	}
-}
-
diff --git a/gtk2_ardour/imageframe_time_axis_view.h b/gtk2_ardour/imageframe_time_axis_view.h
deleted file mode 100644
index 1191068..0000000
--- a/gtk2_ardour/imageframe_time_axis_view.h
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
-    Copyright (C) 2003 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_imageframe_time_axis_view_h__
-#define __ardour_imageframe_time_axis_view_h__
-
-#include <list>
-#include <cmath>
-
-#include <gdkmm/color.h>
-
-#include <jack/jack.h>
-
-#include <libgnomecanvasmm.h>
-#include "canvas.h"
-#include "simplerect.h"
-
-
-class PublicEditor ;
-class ImageFrameTimeAxis ;
-class ImageFrameView ;
-class ImageFrameTimeAxisGroup ;
-
-/**
- * ImageFrameTimeAxisView defines the time axis view helper
- * This object is responsible for the time axis canvas view, and
- * maintains the list of items that have been added to it
- *
- */
-class ImageFrameTimeAxisView : public sigc::trackable
-{
-	public:
-		//---------------------------------------------------------------------------------------//
-		// Constructor / Desctructor
-
-		/**
-		 * Constructs a new ImageFrameTimeAxisView.
-		 *
-		 * @param ifta the parent ImageFrameTimeAxis of this view helper
-		 */
-		ImageFrameTimeAxisView(ImageFrameTimeAxis& ifta) ;
-
-		/**
-		 * Destructor
-		 * Responsible for destroying all items tat may have been added to this time axis
-		 */
-		~ImageFrameTimeAxisView () ;
-
-		//---------------------------------------------------------------------------------------//
-		// Parent/Child helper object accessors
-
-		/**
-		 * Returns the TimeAxisView thatt his object is acting as a helper for
-		 *
-		 * @return the TimeAxisView that this object is acting as a view helper for
-		 */
-		ImageFrameTimeAxis& trackview() { return _trackview; }
-
-		/**
-		 *
-		 */
-		ArdourCanvas::Group * canvas_item() { return &canvas_group; }
-
-
-		//---------------------------------------------------------------------------------------//
-		// ui methods & data
-
-		/**
-		 * Sets the height of the time axis view and the item upon it
-		 *
-		 * @param height the new height
-		 */
-		int set_height(gdouble) ;
-
-		/**
-		 * Sets the position of this view helper on the canvas
-		 *
-		 * @param x the x position upon the canvas
-		 * @param y the y position upon the canvas
-		 */
-		int set_position(gdouble x, gdouble y) ;
-
-		/**
-		 * Sets the current samples per unit.
-		 * this method tells each item upon the time axis of the change
-		 *
-		 * @param spu the new samples per canvas unit value
-		 */
-		int set_samples_per_unit(gdouble spu) ;
-
-		/**
-		 * Returns the current samples per unit of this time axis view helper
-		 *
-		 * @return the current samples per unit of this time axis view helper
-		 */
-		gdouble get_samples_per_unit() { return _samples_per_unit; }
-
-		/**
-		 * Sets the color of the items contained uopn this view helper
-		 *
-		 * @param color the new base color
-		 */
-		void apply_color (Gdk::Color&) ;
-
-		//---------------------------------------------------------------------------------------//
-		// Child ImageFrameTimeAxisGroup Accessors/Mutators
-
-		/**
-		 * Adds an ImageFrameTimeAxisGroup to the list of items upon this time axis view helper
-		 * the new ImageFrameTimeAxisGroup is returned
-		 *
-		 * @param group_id the unique id of the new group
-		 * @param src the identity of the object that initiated the change
-		 */
-		ImageFrameTimeAxisGroup* add_imageframe_group(std::string group_id, void* src) ;
-
-		/**
-		 * Returns the named ImageFrameTimeAxisGroup or 0 if the named group does not exist on this view helper
-		 *
-		 * @param group_id the unique id of the group to search for
-		 * @return the named ImageFrameTimeAxisGroup, or 0 if it is not held upon this view
-		 */
-		ImageFrameTimeAxisGroup* get_named_imageframe_group(std::string group_id) ;
-
-		/**
-		 * Removes and returns the named ImageFrameTimeAxisGroup from the list of ImageFrameTimeAxisGroup held by this view helper
-		 *
-		 * @param group_id the ImageFrameTimeAxisGroup unique id to remove
-		 * @param src the identity of the object that initiated the change
-		 * @see add_imageframe_group
-		 */
-		ImageFrameTimeAxisGroup* remove_named_imageframe_group(std::string group_id, void* src) ;
-
-		/**
-		 * Removes the specified ImageFrameTimeAxisGroup from the list of ImageFrameTimeAxisGroups upon this TimeAxis.
-		 *
-		 * @param iftag the ImageFrameView to remove
-		 */
-		void remove_imageframe_group(ImageFrameTimeAxisGroup* iftag, void* src) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Selected group methods
-
-		/**
-		 * Sets the currently selected group upon this time axis
-		 *
-		 * @param ifv the item to set selected
-		 */
-		void set_selected_imageframe_group(ImageFrameTimeAxisGroup* iftag) ;
-
-		/**
-		 * Clears the currently selected image frame group unpo this time axis
-		 *
-		 */
-		void clear_selected_imageframe_group() ;
-
-		/**
-		 * Returns the currently selected group upon this time axis
-		 *
-		 * @return the currently selected group upon this time axis
-		 */
-		ImageFrameTimeAxisGroup* get_selected_imageframe_group() const ;
-
-
-		/**
-		 * Sets the duration of the selected ImageFrameView to the specified number of seconds
-		 *
-		 * @param sec the duration to set the ImageFrameView to, in seconds
-		 */
-		void set_imageframe_duration_sec(double sec) ;
-
-		//---------------------------------------------------------------------------------------//
-		// Selected item methods
-
-		/**
-		 * Sets the currently selected image frame view item
-		 *
-		 * @param iftag the group the selected item is part
-		 * @param ifv the selected item
-		 */
-		void set_selected_imageframe_view(ImageFrameTimeAxisGroup* iftag, ImageFrameView* ifv) ;
-
-		/**
-		 * Clears the currently selected image frame view item
-		 *
-		 * @param clear_group set true if the selected parent group of the item should be cleared also
-		 */
-		void clear_selected_imageframe_item(bool clear_group) ;
-
-		/**
-		 * Returns the currently selected image frame view item upon this time axis
-		 *
-		 * @return the currently selected image frame view item
-		 */
-		ImageFrameView* get_selected_imageframe_view() const ;
-
-
-
-		/**
-		 * Removes the currently selected ImageFrameTimeAxisGroup
-		 *
-		 * @param src the identity of the object that initiated the change
-		 * @see add_imageframe_group
-		 */
-		void remove_selected_imageframe_item(void* src) ;
-
-
-		//---------------------------------------------------------------------------------//
-		// Emitted Signals
-
-		/** Emitted when and ImageFrameGroup is added to this time axis */
-		sigc::signal<void,ImageFrameTimeAxisGroup*,void*> ImageFrameGroupAdded ;
-
-		/** Emitted when an ImageFrameGroup is removed from this time axis */
-		sigc::signal<void,std::string,void*> ImageFrameGroupRemoved ;
-
-	protected:
-
-
-	private:
-		/**
-		 * convenience method to re-get the samples per unit and tell items upon this view
-		 *
-		 */
-		void reset_samples_per_unit() ;
-
-		/**
-		 * The list of ImageFrameViews held by this view helper */
-		typedef std::list<ImageFrameTimeAxisGroup *> ImageFrameGroupList ;
-		ImageFrameGroupList imageframe_groups ;
-
-		/** the currently selected time axis item upon this time axis */
-		ImageFrameTimeAxisGroup* selected_imageframe_group ;
-
-		/**
-		 * thecurrently selected image frame view
-		 * we keep this here so that we only have one per view, not one per group
-		 */
-		ImageFrameView* selected_imageframe_view ;
-
-
-
-		/* the TimeAxisView that this object is acting as the view helper for */
-		ImageFrameTimeAxis& _trackview ;
-
-		ArdourCanvas::Group       canvas_group ;
-		ArdourCanvas::SimpleRect  canvas_rect; /* frame around the whole thing */
-
-		/** the current samples per unit */
-		double _samples_per_unit ;
-
-		/* XXX why are these different? */
-		Gdk::Color region_color ;
-		uint32_t stream_base_color ;
-
-} ; /* class ImageFrameTimeAxisView */
-
-#endif /* __ardour_imageframe_time_axis_view_h__ */
diff --git a/gtk2_ardour/imageframe_view.cc b/gtk2_ardour/imageframe_view.cc
deleted file mode 100644
index 9b9a8c2..0000000
--- a/gtk2_ardour/imageframe_view.cc
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
-    Copyright (C) 2003 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 <algorithm>
-#include <cmath>
-
-#include <gtkmm.h>
-#include <gtkmm2ext/gtk_ui.h>
-
-#include "imageframe_time_axis.h"
-#include "imageframe_time_axis_group.h"
-#include "marker_time_axis.h"
-#include "marker_time_axis_view.h"
-#include "public_editor.h"
-#include "utils.h"
-#include "imageframe_view.h"
-#include "imageframe.h"
-#include "canvas_impl.h"
-#include "gui_thread.h"
-
-using namespace ARDOUR;
-using namespace Gtk;
-
-sigc::signal<void,ImageFrameView*> ImageFrameView::GoingAway;
-
-/**
- * Constructs a new ImageFrameView upon the canvas
- *
- * @param item_id unique id of this item
- * @param parent the parent canvas item
- * @param tv the time axis view that this item is to be placed upon
- * @param group the ImageFrameGroup that this item is a member of
- * @param spu the current samples per canvas unit
- * @param start the start frame ogf this item
- * @param duration the duration of this item
- * @param rgb_data the rgb data of the image
- * @param width the width of the original rgb_data image data
- * @param height the width of the origianl rgb_data image data
- * @param num_channels the number of color channels within rgb_data
- */
-ImageFrameView::ImageFrameView(const string & item_id,
-	ArdourCanvas::Group *parent,
-	ImageFrameTimeAxis* tv,
-	ImageFrameTimeAxisGroup* item_group,
-	double spu,
-       Gdk::Color& basic_color,
-	framepos_t start,
-	framecnt_t duration,
-	unsigned char* rgb_data,
-	uint32_t width,
-	uint32_t height,
-	uint32_t num_channels)
-  : TimeAxisViewItem(item_id, *parent, *tv, spu, basic_color, start, duration,
-		     TimeAxisViewItem::Visibility (TimeAxisViewItem::ShowNameText|
-						   TimeAxisViewItem::ShowNameHighlight|
-						   TimeAxisViewItem::ShowFrame|
-						   TimeAxisViewItem::ShowHandles))
-
-{
-	the_parent_group = item_group;
-	set_name_text(item_id);
-
-	image_data_width = width;
-	image_data_height = height;
-	image_data_num_channels = num_channels;
-
-	//This should be art_free'd once the ArtPixBuf is destroyed - this should happen when we destroy the imageframe canvas item
-	unsigned char* the_rgb_data = (unsigned char*) art_alloc(width*height*num_channels);
-	memcpy(the_rgb_data, rgb_data, (width*height*num_channels));
-
-	ArtPixBuf* pbuf;
-	pbuf = art_pixbuf_new_rgba(the_rgb_data, width, height, (num_channels * width));
-	imageframe = 0;
-
-	//calculate our image width based on the track height
-	double im_ratio = (double)width/(double)height;
-	double im_width = ((double)(trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE) * im_ratio);
-
-	imageframe = new ImageFrame (*group, pbuf, 1.0, 1.0, ANCHOR_NW, im_width, (trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE));
-
-	frame_handle_start->signal_event().connect (sigc::bind (sigc::mem_fun (trackview.editor, &PublicEditor::canvas_imageframe_start_handle_event), frame_handle_start, this));
-	frame_handle_end->signal_event().connect (sigc::bind (sigc::mem_fun (trackview.editor, &PublicEditor::canvas_imageframe_end_handle_event), frame_handle_end, this));
-	group->signal_event().connect (sigc::bind (sigc::mem_fun (trackview.editor, &PublicEditor::canvas_imageframe_item_view_event), imageframe, this));
-
-	frame_handle_start->raise_to_top();
-	frame_handle_end->raise_to_top();
-
-	set_position(start, this);
-	set_duration(duration, this);
-
-	MarkerView::CatchDeletion.connect (*this, boost::bind (&ImageFrameView::remove_marker_view_item, this, _1), gui_context());
-}
-
-/**
- * Destructor
- * Reposible for removing and destroying all marker items associated with this item
- */
-ImageFrameView::~ImageFrameView()
-{
-	CatchDeletion (this);
-
-	// destroy any marker items we have associated with this item
-
-	for(MarkerViewList::iterator iter = marker_view_list.begin(); iter != marker_view_list.end(); ++iter)
-	{
-		MarkerView* mv = (*iter);
-
-		MarkerViewList::iterator next = iter;
-		next++;
-
-		// remove the item from our marker list
-		// the current iterator becomes invalid after this point, so we cannot call next upon it
-		// luckily enough, we already have next
-		marker_view_list.erase(iter);
-
-		// remove the item from the marker time axis
-		MarkerTimeAxisView* mtav = dynamic_cast<MarkerTimeAxis*>(&mv->get_time_axis_view())->get_view();
-		if(mtav)
-		{
-			mtav->remove_marker_view(mv, this);
-		}
-
-		mv->set_marked_item(0);
-		delete mv;
-		mv = 0;
-
-		// set our iterator to next, as we have invalided the current iterator with the call to erase
-		iter = next;
-	}
-
-	// if we are the currently selected item withi the parent track, we need to se-select
-	if(the_parent_group)
-	{
-		if(the_parent_group->get_view().get_selected_imageframe_view() == this)
-		{
-			the_parent_group->get_view().clear_selected_imageframe_item(false);
-		}
-	}
-
-	delete imageframe;
-	imageframe = 0;
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Position and duration Accessors/Mutators
-
-/**
- * Set the position of this item to the specified value
- *
- * @param pos the new position
- * @param src the identity of the object that initiated the change
- * @return true if the position change was a success, false otherwise
- */
-bool
-ImageFrameView::set_position(framepos_t pos, void* src, double* delta)
-{
-	framepos_t old_pos = frame_position;
-
-	// do the standard stuff
-	bool ret = TimeAxisViewItem::set_position(pos, src, delta);
-
-	// everything went ok with the standard stuff?
- 	if (ret) {
-		/* move each of our associated markers with this ImageFrameView */
-		for (MarkerViewList::iterator i = marker_view_list.begin(); i != marker_view_list.end(); ++i)
-		{
-			// calculate the offset of the marker
-			MarkerView* mv = (MarkerView*)*i;
-			framepos_t marker_old_pos = mv->get_position();
-
-			mv->set_position(pos + (marker_old_pos - old_pos), src);
-		}
-	}
-
-	return(ret);
-}
-
-/**
- * Sets the duration of this item
- *
- * @param dur the new duration of this item
- * @param src the identity of the object that initiated the change
- * @return true if the duration change was succesful, false otherwise
- */
-bool
-ImageFrameView::set_duration(framepos_t dur, void* src)
-{
-	/* do the standard stuff */
-	bool ret = TimeAxisViewItem::set_duration(dur, src);
-
-	// eveything went ok with the standard stuff?
-	if(ret)
-	{
-		/* handle setting the sizes of our canvas itesm based on the new duration */
-		imageframe->property_drawwidth() = trackview.editor.frame_to_pixel(get_duration());
-	}
-
-	return(ret);
-}
-
-//---------------------------------------------------------------------------------------//
-// Parent Component Methods
-
-/**
- * Sets the parent ImageFrameTimeAxisGroup of thie item
- * each Item must be part of exactly one group (or 'scene') upon the timeline
- *
- * @param group the new parent group
- */
-void
-ImageFrameView::set_time_axis_group(ImageFrameTimeAxisGroup* group)
-{
-	the_parent_group = group;
-}
-
-/**
- * Returns the parent group of this item
- *
- * @return the parent group of this item
- */
-ImageFrameTimeAxisGroup*
-ImageFrameView::get_time_axis_group()
-{
-	return(the_parent_group);
-}
-
-
-//---------------------------------------------------------------------------------------//
-// ui methods
-
-/**
- * Set the height of this item
- *
- * @param h the new height
- */
-void
-ImageFrameView::set_height (gdouble h)
-{
-	// set the image size
-	// @todo might have to re-get the image data, for a large height...hmmm.
-	double im_ratio = (double)image_data_width/(double)image_data_height;
-
-	imageframe->property_width() = (h - TimeAxisViewItem::NAME_Y_OFFSET) * im_ratio;
-	imageframe->property_height() = h - TimeAxisViewItem::NAME_Y_OFFSET;
-
-	frame->raise_to_top();
-	imageframe->raise_to_top();
-	name_highlight->raise_to_top();
-	name_pixbuf->raise_to_top();
-	frame_handle_start->raise_to_top();
-	frame_handle_end->raise_to_top();
-
-	name_pixbuf->property_y() = h - TimeAxisViewItem::NAME_Y_OFFSET;
-	frame->property_y2() = h;
-
-	name_highlight->property_y1() = (gdouble) h - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE;
-	name_highlight->property_y2() = (gdouble) h - 1.0;
-}
-
-
-//---------------------------------------------------------------------------------------//
-// MarkerView methods
-
-/**
- * Adds a markerView to the list of marker views associated with this item
- *
- * @param item the marker item to add
- * @param src the identity of the object that initiated the change
- */
-void
-ImageFrameView::add_marker_view_item(MarkerView* item, void* src)
-{
-	marker_view_list.push_back(item);
-	 MarkerViewAdded(item, src); /* EMIT_SIGNAL */
-}
-
-/**
- * Removes the named marker view from the list of marker view associated with this item
- * The Marker view is not destroyed on removal, so the caller must handle the item themself
- *
- * @param markId the id/name of the item to remove
- * @param src the identity of the object that initiated the change
- * @return the removed marker item
- */
-MarkerView*
-ImageFrameView::remove_named_marker_view_item(const string & markerId, void* src)
-{
-	MarkerView* mv = 0;
-	MarkerViewList::iterator i = marker_view_list.begin();
-
-	while(i != marker_view_list.end())
-	{
-		if (((MarkerView*)*i)->get_item_name() == markerId)
-		{
-			mv = (*i);
-
-			marker_view_list.erase(i);
-
-			 MarkerViewRemoved(mv,src); /* EMIT_SIGNAL */
-
-			// iterator is now invalid, but since we should only ever have
-			// one item with the specified name, things are ok, and we can
-			// break from the while loop
-			break;
-		}
-		i++;
-	}
-
-	return(mv);
-}
-
-/**
- * Removes item from the list of marker views assocaited with this item
- * This method will do nothing if item if not assiciated with this item
- *
- * @param item the item to remove
- * @param src the identity of the object that initiated the change
- */
-void
-ImageFrameView::remove_marker_view_item (MarkerView* mv)
-{
-	ENSURE_GUI_THREAD (*this, &ImageFrameView::remove_marker_view_item, mv, src)
-
-	MarkerViewList::iterator i;
-
-	if ((i = find (marker_view_list.begin(), marker_view_list.end(), mv)) != marker_view_list.end()) {
-		marker_view_list.erase(i);
-		MarkerViewRemoved (mv, src); /* EMIT_SIGNAL */
-	}
-}
-
-/**
- * Determines if the named marker is one of those associated with this item
- *
- * @param markId the id/name of the item to search for
- */
-bool
-ImageFrameView::has_marker_view_item(const string & mname)
-{
-	bool result = false;
-
-	for (MarkerViewList::const_iterator ci = marker_view_list.begin(); ci != marker_view_list.end(); ++ci)
-	{
-		if (((MarkerView*)*ci)->get_item_name() == mname)
-		{
-			result = true;
-
-			// found the item, so we can break the for loop
-			break;
-		}
-	}
-
-	return(result);
-}
diff --git a/gtk2_ardour/imageframe_view.h b/gtk2_ardour/imageframe_view.h
deleted file mode 100644
index 49b2903..0000000
--- a/gtk2_ardour/imageframe_view.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
-    Copyright (C) 2003 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 __gtk_ardour_imageframe_view_h__
-#define __gtk_ardour_imageframe_view_h__
-
-#include <string>
-#include <gdkmm/color.h>
-#include <libgnomecanvas/libgnomecanvas.h>
-#include <sigc++/signal.h>
-#include <list>
-
-#include "canvas.h"
-#include "enums.h"
-#include "time_axis_view_item.h"
-#include "marker_view.h"
-
-class ImageFrameTimeAxis;
-class ImageFrameTimeAxisGroup ;
-
-/**
- * An ImageFrameItem to display an image upon the ardour time line
- *
- */
-class ImageFrameView : public TimeAxisViewItem
-{
-	public:
-		//---------------------------------------------------------------------------------------//
-		// Constructor / Desctructor
-
-		/**
-		 * Constructs a new ImageFrameView upon the canvas
-		 *
-		 * @param item_id unique id of this item
-		 * @param parent the parent canvas item
-		 * @param tv the time axis view that this item is to be placed upon
-		 * @param group the ImageFrameGroup that this item is a member of
-		 * @param spu the current samples per canvas unit
-		 * @param start the start frame ogf this item
-		 * @param duration the duration of this item
-		 * @param rgb_data the rgb data of the image
-		 * @param width the width of the original rgb_data image data
-		 * @param height the width of the origianl rgb_data image data
-		 * @param num_channels the number of color channels within rgb_data
-		 */
-		ImageFrameView(const std::string & item_id,
-			 ArdourCanvas::Group *parent,
-			ImageFrameTimeAxis *tv,
-			ImageFrameTimeAxisGroup* group,
-			double spu,
-		        Gdk::Color& base_color,
-			framepos_t start,
-			framecnt_t duration,
-			unsigned char* rgb_data,
-			uint32_t width,
-			uint32_t height,
-			uint32_t num_channels) ;
-
-		/**
-		 * Destructor
-		 * Reposible for removing and destroying all marker items associated with this item
-		 */
-		~ImageFrameView() ;
-
-		static PBD::Signal1<void,ImageFrameView*> CatchDeletion;
-
-		//---------------------------------------------------------------------------------------//
-		// Position and duration Accessors/Mutators
-
-		/**
-		 * Set the position of this item to the specified value
-		 *
-		 * @param pos the new position
-		 * @param src the identity of the object that initiated the change
-		 * @return true if the position change was a success, false otherwise
-		 */
-		virtual bool set_position(framepos_t pos, void* src, double* delta = 0) ;
-
-		/**
-		 * Sets the duration of this item
-		 *
-		 * @param dur the new duration of this item
-		 * @param src the identity of the object that initiated the change
-		 * @return true if the duration change was succesful, false otherwise
-		 */
-		virtual bool set_duration(framepos_t dur, void* src) ;
-
-		//---------------------------------------------------------------------------------------//
-		// Parent Component Methods
-
-		/**
-		 * Sets the parent ImageFrameTimeAxisGroup of thie item
-		 * each Item must be part of exactly one group (or 'scene') upon the timeline
-		 *
-		 * @param group the new parent group
-		 */
-		void set_time_axis_group(ImageFrameTimeAxisGroup* group) ;
-
-		/**
-		 * Returns the parent group of this item
-		 *
-		 * @return the parent group of this item
-		 */
-		ImageFrameTimeAxisGroup* get_time_axis_group() ;
-
-		//---------------------------------------------------------------------------------------//
-		// ui methods
-
-		/**
-		 * Set the height of this item
-		 *
-		 * @param h the new height
-		 */
-		virtual void set_height(gdouble h) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// MarkerView methods
-
-		/**
-		 * Adds a markerView to the list of marker views associated with this item
-		 *
-		 * @param item the marker item to add
-		 * @param src the identity of the object that initiated the change
-		 */
-		void add_marker_view_item(MarkerView* item, void* src) ;
-
-		/**
-		 * Removes the named marker view from the list of marker view associated with this item
-		 * The Marker view is not destroyed on removal, so the caller must handle the item themself
-		 *
-		 * @param markId the id/name of the item to remove
-		 * @param src the identity of the object that initiated the change
-		 * @return the removed marker item
-		 */
-		MarkerView* remove_named_marker_view_item(const std::string & markId, void* src) ;
-
-		/**
-		 * Removes item from the list of marker views assocaited with this item
-		 * This method will do nothing if item if not assiciated with this item
-		 * The Marker view is not destroyed on removal, so the caller must handle the item themself
-		 *
-		 * @param item the item to remove
-		 * @param src the identity of the object that initiated the change
-		 */
-		void remove_marker_view_item(MarkerView* item, void* src) ;
-
-		/**
-		 * Determines if the named marker is one of those associated with this item
-		 *
-		 * @param markId the id/name of the item to search for
-		 */
-		bool has_marker_view_item(const std::string & markId) ;
-
-
-		//---------------------------------------------------------------------------------//
-		// Emitted Signals
-
-		/** Emitted when a marker Item is added to this Item */
-		sigc::signal<void,MarkerView*,void*> MarkerViewAdded ;
-
-		/** Emitted when a Marker Item is added to this Item */
-		sigc::signal<void,MarkerView*,void*> MarkerViewRemoved ;
-
-	private:
-		/** the list of MarkerViews associated with this item */
-		typedef std::list<MarkerView*> MarkerViewList ;
-		MarkerViewList marker_view_list ;
-
-
-		/** The parent group that this item is a member of */
-		ImageFrameTimeAxisGroup* the_parent_group ;
-
-		// ------- Image data -----------
-
-		/** the image data that we display */
-		//unsigned char* the_rgb_data ;
-
-		/** The width of the image contained within the_rgb_data */
-		uint32_t image_data_width ;
-
-		/** The height of the image contained within the_rgb_data */
-		uint32_t image_data_height ;
-
-		/** the number of channels contained in the_rgb_data */
-		uint32_t image_data_num_channels ;
-
-
-		// ------- Our canvas element -----------
-
-		/** the CanvasImageFrame to display the image */
-		ArdourCanvas::ImageFrame* imageframe ;
-
-} ; /* class ImageFrameView */
-
-#endif /* __gtk_ardour_imageframe_view_h__ */
diff --git a/gtk2_ardour/io_selector.cc b/gtk2_ardour/io_selector.cc
index 544963f..31f8cfa 100644
--- a/gtk2_ardour/io_selector.cc
+++ b/gtk2_ardour/io_selector.cc
@@ -235,8 +235,7 @@ bool
 IOSelectorWindow::wm_delete (GdkEventAny* /*event*/)
 {
 	_selector.Finished (IOSelector::Accepted);
-	hide ();
-	return true;
+	return false;
 }
 
 
diff --git a/gtk2_ardour/itest.cc b/gtk2_ardour/itest.cc
deleted file mode 100644
index db6ede0..0000000
--- a/gtk2_ardour/itest.cc
+++ /dev/null
@@ -1,222 +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 <map>
-#include <vector>
-#include <string>
-#include <iostream>
-
-#include <gtkmm/main.h>
-#include <gtkmm/window.h>
-#include <gtkmm/box.h>
-#include <gtkmm/scrolledwindow.h>
-#include <gtkmm2ext/dndtreeview.h>
-#include <gtkmm/treemodel.h>
-#include <gtkmm/treestore.h>
-#include <gtkmm/treepath.h>
-#include <gtkmm/button.h>
-#include <gtkmm/window.h>
-#include <jack/jack.h>
-
-using namespace std;
-using namespace Gtk;
-using namespace Gtkmm2ext;
-using namespace Glib;
-
-struct ModelColumns : public TreeModel::ColumnRecord {
-    ModelColumns() {
-	    add (used);
-	    add (text);
-	    add (port);
-    }
-    TreeModelColumn<bool>         used;
-    TreeModelColumn<string>      text;
-    TreeModelColumn<jack_port_t*> port;
-};
-
-jack_client_t* jack;
-
-void
-fill_it (RefPtr<TreeStore> model, TreeView* display, ModelColumns* columns)
-{
-	RefPtr<TreeModel> old = display->get_model();
-	display->set_model (RefPtr<TreeStore>(0));
-
-	model->clear ();
-
-	const char ** ports;
-	typedef map<string,vector<pair<string,string> > > PortMap;
-	PortMap portmap;
-	PortMap::iterator i;
-
-	ports = jack_get_ports (jack, "", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput);
-
-	if (ports == 0) {
-		goto out;
-	}
-
-	/* find all the client names and group their ports into a list-by-client */
-
-	for (int n = 0; ports[n]; ++n) {
-
-		pair<string,vector<pair<string,string> > > newpair;
-		pair<string,string> strpair;
-		std::pair<PortMap::iterator,bool> result;
-
-		string str = ports[n];
-		string::size_type pos;
-		string portname;
-
-		pos = str.find (':');
-
-		newpair.first = str.substr (0, pos);
-		portname = str.substr (pos+1);
-
-		/* this may or may not succeed at actually inserting.
-		   we don't care, however: we just want an iterator
-		   that gives us either the inserted element or
-		   the existing one with the same name.
-		*/
-
-		result = portmap.insert (newpair);
-
-		strpair.first = portname;
-		strpair.second = str;
-
-		result.first->second.push_back (strpair);
-	}
-
-
-	for (i = portmap.begin(); i != portmap.end(); ++i) {
-
-		/* i->first is a client name, i->second is a PortMap of all of its ports */
-
-		TreeModel::Row parent = *(model->append());
-
-		parent[columns->used] = false;
-		parent[columns->text] = i->first;
-		parent[columns->port] = 0;
-
-		for (vector<pair<string,string> >::iterator s = i->second.begin(); s != i->second.end(); ++s) {
-
-			/* s->first is a port name */
-
-			TreeModel::Row row = *(model->append (parent.children()));
-
-			row[columns->used] = ((random()%2) == 1);
-			row[columns->text] = s->first;
-			row[columns->port] = (jack_port_t*) random();
-		}
-	}
-
-  out:
-	display->set_model (old);
-}
-
-void
-selection_changed (RefPtr<TreeModel> model, TreeView* display, ModelColumns* columns)
-{
-//	TreeSelection::ListHandle_Path selection = display->get_selection()->get_selected_rows ();
-//
-//	for (TreeSelection::ListHandle_Path::iterator x = selection.begin(); x != selection.end(); ++x) {
-//		cerr << "selected: " << (*(model->get_iter (*x)))[columns->text] << endl;
-//	}
-}
-
-bool
-selection_filter (const RefPtr<TreeModel>& model, const TreeModel::Path& path, bool yn, ModelColumns* columns)
-{
-	return (*(model->get_iter (path)))[columns->port] != 0;
-}
-
-void
-object_drop (string type, uint32_t cnt, void** ptr)
-{
-	cerr << "Got an object drop of " << cnt << " pointer(s) of type " << type << endl;
-}
-
-int
-main (int argc, char* argv[])
-{
-	Main app (&argc, &argv);
-	Window win;
-	VBox   vpacker;
-	HBox   hpacker;
-	Button rescan ("rescan");
-	ScrolledWindow scrollerA;
-	ScrolledWindow scrollerB;
-	DnDTreeView displayA;
-	DnDTreeView displayB;
-	ModelColumns columns;
-
-	if ((jack = jack_client_new ("itest")) == NULL) {
-		return -1;
-	}
-
-	RefPtr<TreeStore> modelA = TreeStore::create (columns);
-	RefPtr<TreeStore> modelB = TreeStore::create (columns);
-
-	displayA.set_model (modelA);
-	displayA.append_column ("Use", columns.used);
-	displayA.append_column ("Source/Port", columns.text);
-	displayA.set_reorderable (true);
-	displayA.add_object_drag (columns.port.index(), "ports");
-	displayA.signal_object_drop.connect (ptr_fun (object_drop));
-
-	displayA.get_selection()->set_mode (SELECTION_MULTIPLE);
-	displayA.get_selection()->set_select_function (sigc::bind (ptr_fun (selection_filter), &columns));
-	displayA.get_selection()->signal_changed().connect (sigc::bind (ptr_fun (selection_changed), modelA, &displayA, &columns));
-
-	displayB.set_model (modelB);
-	displayB.append_column ("Use", columns.used);
-	displayB.append_column ("Source/Port", columns.text);
-	displayB.set_reorderable (true);
-	displayB.add_object_drag (columns.port.index(), "ports");
-	displayB.signal_object_drop.connect (ptr_fun (object_drop));
-
-	displayB.get_selection()->set_mode (SELECTION_MULTIPLE);
-	displayB.get_selection()->set_select_function (sigc::bind (ptr_fun (selection_filter), &columns));
-	displayB.get_selection()->signal_changed().connect (sigc::bind (ptr_fun (selection_changed), modelB, &displayB, &columns));
-
-	scrollerA.add (displayA);
-	scrollerB.add (displayB);
-
-	hpacker.pack_start (scrollerA);
-	hpacker.pack_start (scrollerB);
-
-	vpacker.pack_start (hpacker);
-	vpacker.pack_start (rescan, false, false);
-
-	win.add (vpacker);
-	win.set_size_request (500, 400);
-	win.show_all ();
-
-	rescan.signal_clicked().connect (sigc::bind (ptr_fun (fill_it), modelA, &displayA, &columns));
-	rescan.signal_clicked().connect (sigc::bind (ptr_fun (fill_it), modelB, &displayB, &columns));
-
-	fill_it (modelA, &displayA, &columns);
-	fill_it (modelB, &displayB, &columns);
-
-	displayA.expand_all();
-	displayB.expand_all();
-
-	app.run ();
-
-	jack_client_close (jack);
-}
diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc
index 9ccff8d..6f48864 100644
--- a/gtk2_ardour/level_meter.cc
+++ b/gtk2_ardour/level_meter.cc
@@ -22,7 +22,6 @@
 #include "ardour/meter.h"
 
 #include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/fastmeter.h>
 #include <gtkmm2ext/barcontroller.h>
 #include "midi++/manager.h"
 #include "pbd/fastlog.h"
@@ -44,29 +43,29 @@ using namespace Gtkmm2ext;
 using namespace Gtk;
 using namespace std;
 
-//sigc::signal<void> LevelMeter::ResetAllPeakDisplays;
-//sigc::signal<void,RouteGroup*> LevelMeter::ResetGroupPeakDisplays;
-
-
-LevelMeter::LevelMeter (Session* s)
-	: _meter (0)
+LevelMeterBase::LevelMeterBase (Session* s, PBD::EventLoop::InvalidationRecord* ir, FastMeter::Orientation o)
+	: parent_invalidator(ir)
+	, _meter (0)
+	, _meter_orientation(o)
+	, regular_meter_width (6)
 	, meter_length (0)
+	, thin_meter_width(2)
 {
 	set_session (s);
-	set_spacing (1);
-	Config->ParameterChanged.connect (_parameter_connection, invalidator (*this), boost::bind (&LevelMeter::parameter_changed, this, _1), gui_context());
-	UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &LevelMeter::on_theme_changed));
-	ColorsChanged.connect (sigc::mem_fun (*this, &LevelMeter::color_handler));
+	Config->ParameterChanged.connect (_parameter_connection, parent_invalidator, boost::bind (&LevelMeterBase::parameter_changed, this, _1), gui_context());
+	UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &LevelMeterBase::on_theme_changed));
+	ColorsChanged.connect (sigc::mem_fun (*this, &LevelMeterBase::color_handler));
 	max_peak = minus_infinity();
+	meter_type = MeterPeak;
 }
 
 void
-LevelMeter::on_theme_changed()
+LevelMeterBase::on_theme_changed()
 {
 	style_changed = true;
 }
 
-LevelMeter::~LevelMeter ()
+LevelMeterBase::~LevelMeterBase ()
 {
 	for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); i++) {
 		delete (*i).meter;
@@ -74,80 +73,164 @@ LevelMeter::~LevelMeter ()
 }
 
 void
-LevelMeter::set_meter (PeakMeter* meter)
+LevelMeterBase::set_meter (PeakMeter* meter)
 {
 	_configuration_connection.disconnect();
+	_meter_type_connection.disconnect();
+
 	_meter = meter;
 
 	if (_meter) {
-		_meter->ConfigurationChanged.connect (_configuration_connection, invalidator (*this), boost::bind (&LevelMeter::configuration_changed, this, _1, _2), gui_context());
+		_meter->ConfigurationChanged.connect (_configuration_connection, parent_invalidator, boost::bind (&LevelMeterBase::configuration_changed, this, _1, _2), gui_context());
+		_meter->TypeChanged.connect (_meter_type_connection, parent_invalidator, boost::bind (&LevelMeterBase::meter_type_changed, this, _1), gui_context());
+	}
+}
+
+static float meter_lineup_cfg(MeterLineUp lul, float offset) {
+	switch (lul) {
+		case MeteringLineUp24:
+			return offset + 6.0;
+		case MeteringLineUp20:
+			return offset + 2.0;
+		case MeteringLineUp18:
+			return offset;
+		case MeteringLineUp15:
+			return offset - 3.0;
+		default:
+			break;
+	}
+	return offset;
+}
+
+static float meter_lineup(float offset) {
+	return meter_lineup_cfg(Config->get_meter_line_up_level(), offset);
+}
+
+static float vu_standard() {
+	// note - default meter config is +2dB (france)
+	switch (Config->get_meter_vu_standard()) {
+		default:
+		case MeteringVUfrench:   // 0VU = -2dBu
+			return 0;
+		case MeteringVUamerican: // 0VU =  0dBu
+			return -2;
+		case MeteringVUstandard: // 0VU = +4dBu
+			return -6;
+		case MeteringVUeight:    // 0VU = +8dBu
+			return -10;
 	}
 }
 
 float
-LevelMeter::update_meters ()
+LevelMeterBase::update_meters ()
 {
 	vector<MeterInfo>::iterator i;
 	uint32_t n;
-	float peak, mpeak;
 
 	if (!_meter) {
 		return 0.0f;
 	}
 
+	uint32_t nmidi = _meter->input_streams().n_midi();
+
 	for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
 		if ((*i).packed) {
-			peak = _meter->peak_power (n);
-			(*i).meter->set (log_meter (peak));
-			mpeak = _meter->max_peak_power(n);
-			if (mpeak > max_peak) {
-				max_peak = mpeak;
+			const float mpeak = _meter->meter_level(n, MeterMaxPeak);
+			if (mpeak > (*i).max_peak) {
+				(*i).max_peak = mpeak;
+				(*i).meter->set_highlight(mpeak >= Config->get_meter_peak());
 			}
 			if (mpeak > max_peak) {
 				max_peak = mpeak;
 			}
+
+			if (n < nmidi) {
+				(*i).meter->set (_meter->meter_level (n, MeterPeak));
+			} else {
+				const float peak = _meter->meter_level (n, meter_type);
+				if (meter_type == MeterPeak) {
+					(*i).meter->set (log_meter (peak));
+				} else if (meter_type == MeterIEC1NOR) {
+					(*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0)));
+				} else if (meter_type == MeterIEC1DIN) {
+					(*i).meter->set (meter_deflect_din (peak + meter_lineup_cfg(Config->get_meter_line_up_din(), 3.0)));
+				} else if (meter_type == MeterIEC2BBC || meter_type == MeterIEC2EBU) {
+					(*i).meter->set (meter_deflect_ppm (peak + meter_lineup(0)));
+				} else if (meter_type == MeterVU) {
+					(*i).meter->set (meter_deflect_vu (peak + vu_standard() + meter_lineup(0)));
+				} else if (meter_type == MeterK14) {
+					(*i).meter->set (meter_deflect_k (peak, 14), meter_deflect_k(_meter->meter_level(n, MeterPeak), 14));
+				} else if (meter_type == MeterK20) {
+					(*i).meter->set (meter_deflect_k (peak, 20), meter_deflect_k(_meter->meter_level(n, MeterPeak), 20));
+				} else { // RMS
+					(*i).meter->set (log_meter (peak), log_meter(_meter->meter_level(n, MeterPeak)));
+				}
+			}
 		}
 	}
 	return max_peak;
 }
 
 void
-LevelMeter::parameter_changed (string p)
+LevelMeterBase::parameter_changed (string p)
 {
-	ENSURE_GUI_THREAD (*this, &LevelMeter::parameter_changed, p)
+	ENSURE_GUI_THREAD (*this, &LevelMeterBase::parameter_changed, p)
 
 	if (p == "meter-hold") {
-
 		vector<MeterInfo>::iterator i;
 		uint32_t n;
 
 		for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
-
 			(*i).meter->set_hold_count ((uint32_t) floor(Config->get_meter_hold()));
 		}
 	}
+	else if (p == "meter-line-up-level") {
+		color_changed = true;
+		setup_meters (meter_length, regular_meter_width, thin_meter_width);
+	}
+	else if (p == "meter-style-led") {
+		color_changed = true;
+		setup_meters (meter_length, regular_meter_width, thin_meter_width);
+	}
+	else if (p == "meter-peak") {
+		vector<MeterInfo>::iterator i;
+		uint32_t n;
+
+		for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
+			(*i).max_peak = minus_infinity();
+		}
+	}
 }
 
 void
-LevelMeter::configuration_changed (ChanCount /*in*/, ChanCount /*out*/)
+LevelMeterBase::configuration_changed (ChanCount /*in*/, ChanCount /*out*/)
 {
 	color_changed = true;
-	setup_meters (meter_length, regular_meter_width);
+	setup_meters (meter_length, regular_meter_width, thin_meter_width);
 }
 
 void
-LevelMeter::hide_all_meters ()
+LevelMeterBase::meter_type_changed (MeterType t)
+{
+	meter_type = t;
+	color_changed = true;
+	setup_meters (meter_length, regular_meter_width, thin_meter_width);
+	MeterTypeChanged(t);
+}
+
+void
+LevelMeterBase::hide_all_meters ()
 {
 	for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); ++i) {
 		if ((*i).packed) {
-			remove (*((*i).meter));
+			mtr_remove (*((*i).meter));
 			(*i).packed = false;
 		}
 	}
 }
 
 void
-LevelMeter::setup_meters (int len, int initial_width)
+LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
 {
 	hide_all_meters ();
 
@@ -158,6 +241,7 @@ LevelMeter::setup_meters (int len, int initial_width)
 	int32_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;
 	meter_length = len;
 
 	guint16 width;
@@ -176,72 +260,239 @@ LevelMeter::setup_meters (int len, int initial_width)
 		meters.push_back (MeterInfo());
 	}
 
-	//cerr << "LevelMeter::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG
+	//cerr << "LevelMeterBase::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG
 
 	for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) {
-		uint32_t b, m, t, c;
+		uint32_t c[10];
+		uint32_t b[4];
+		float stp[4];
+		int styleflags = Config->get_meter_style_led() ? 3 : 1;
+		b[0] = ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get();
+		b[1] = ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get();
+		b[2] = 0x991122ff; // red highlight gradient Bot
+		b[3] = 0x551111ff; // red highlight gradient Top
 		if (n < nmidi) {
-			b = ARDOUR_UI::config()->canvasvar_MidiMeterColorBase.get();
-			m = ARDOUR_UI::config()->canvasvar_MidiMeterColorMid.get();
-			t = ARDOUR_UI::config()->canvasvar_MidiMeterColorTop.get();
-			c = ARDOUR_UI::config()->canvasvar_MeterColorClip.get();
+			c[0] = ARDOUR_UI::config()->canvasvar_MidiMeterColor0.get();
+			c[1] = ARDOUR_UI::config()->canvasvar_MidiMeterColor1.get();
+			c[2] = ARDOUR_UI::config()->canvasvar_MidiMeterColor2.get();
+			c[3] = ARDOUR_UI::config()->canvasvar_MidiMeterColor3.get();
+			c[4] = ARDOUR_UI::config()->canvasvar_MidiMeterColor4.get();
+			c[5] = ARDOUR_UI::config()->canvasvar_MidiMeterColor5.get();
+			c[6] = ARDOUR_UI::config()->canvasvar_MidiMeterColor6.get();
+			c[7] = ARDOUR_UI::config()->canvasvar_MidiMeterColor7.get();
+			c[8] = ARDOUR_UI::config()->canvasvar_MidiMeterColor8.get();
+			c[9] = ARDOUR_UI::config()->canvasvar_MidiMeterColor9.get();
+			stp[0] = 115.0 *  32.0 / 128.0;
+			stp[1] = 115.0 *  64.0 / 128.0;
+			stp[2] = 115.0 * 100.0 / 128.0;
+			stp[3] = 115.0 * 112.0 / 128.0;
 		} else {
-			b = ARDOUR_UI::config()->canvasvar_MeterColorBase.get();
-			m = ARDOUR_UI::config()->canvasvar_MeterColorMid.get();
-			t = ARDOUR_UI::config()->canvasvar_MeterColorTop.get();
-			c = ARDOUR_UI::config()->canvasvar_MeterColorClip.get();
+			c[0] = ARDOUR_UI::config()->canvasvar_MeterColor0.get();
+			c[1] = ARDOUR_UI::config()->canvasvar_MeterColor1.get();
+			c[2] = ARDOUR_UI::config()->canvasvar_MeterColor2.get();
+			c[3] = ARDOUR_UI::config()->canvasvar_MeterColor3.get();
+			c[4] = ARDOUR_UI::config()->canvasvar_MeterColor4.get();
+			c[5] = ARDOUR_UI::config()->canvasvar_MeterColor5.get();
+			c[6] = ARDOUR_UI::config()->canvasvar_MeterColor6.get();
+			c[7] = ARDOUR_UI::config()->canvasvar_MeterColor7.get();
+			c[8] = ARDOUR_UI::config()->canvasvar_MeterColor8.get();
+			c[9] = ARDOUR_UI::config()->canvasvar_MeterColor9.get();
+
+			switch (meter_type) {
+				case MeterK20:
+					stp[0] = 115.0 * meter_deflect_k(-40, 20);  //-20
+					stp[1] = 115.0 * meter_deflect_k(-20, 20);  //  0
+					stp[2] = 115.0 * meter_deflect_k(-18, 20);  // +2
+					stp[3] = 115.0 * meter_deflect_k(-16, 20);  // +4
+					c[0] = c[1] = 0x008800ff;
+					c[2] = c[3] = 0x00ff00ff;
+					c[4] = c[5] = 0xffff00ff;
+					c[6] = c[7] = 0xffff00ff;
+					c[8] = c[9] = 0xff0000ff;
+					break;
+				case MeterK14:
+					stp[0] = 115.0 * meter_deflect_k(-34, 14);  //-20
+					stp[1] = 115.0 * meter_deflect_k(-14, 14);  //  0
+					stp[2] = 115.0 * meter_deflect_k(-12, 14);  // +2
+					stp[3] = 115.0 * meter_deflect_k(-10, 14);  // +4
+					c[0] = c[1] = 0x008800ff;
+					c[2] = c[3] = 0x00ff00ff;
+					c[4] = c[5] = 0xffff00ff;
+					c[6] = c[7] = 0xffff00ff;
+					c[8] = c[9] = 0xff0000ff;
+					break;
+				case MeterIEC2BBC:
+					c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = c[6] = c[7] = c[8] = c[9] =
+						ARDOUR_UI::config()->color_by_name ("meter color BBC");
+					stp[0] = stp[1] = stp[2] = stp[3] = 115.0;
+					break;
+				case MeterIEC2EBU:
+					stp[0] = 115.0 * meter_deflect_ppm(-24); // ignored
+					stp[1] = 115.0 * meter_deflect_ppm(-18);
+					stp[2] = 115.0 * meter_deflect_ppm( -9);
+					stp[3] = 115.0 * meter_deflect_ppm(  0); // ignored
+					c[3] = c[2] = c[1];
+					c[6] = c[7] = c[8] = c[9];
+					break;
+				case MeterIEC1NOR:
+					stp[0] = 115.0 * meter_deflect_nordic(-30); // ignored
+					stp[1] = 115.0 * meter_deflect_nordic(-18);
+					stp[2] = 115.0 * meter_deflect_nordic(-12);
+					stp[3] = 115.0 * meter_deflect_nordic( -9); // ignored
+					//c[2] = c[3] = c[1]; // dark-green
+					c[0] = c[1] = c[2]; // bright-green
+					c[6] = c[7] = c[8] = c[9];
+					break;
+				case MeterIEC1DIN:
+					stp[0] = 115.0 * meter_deflect_din(-29); // ignored
+					stp[1] = 115.0 * meter_deflect_din(-18);
+					stp[2] = 115.0 * meter_deflect_din(-15); // ignored
+					stp[3] = 115.0 * meter_deflect_din( -9);
+					c[0] = c[1] = c[2] = c[3] = 0x00aa00ff;
+					c[4] = c[6];
+					c[5] = c[7];
+					break;
+				case MeterVU:
+					stp[0] = 115.0 * meter_deflect_vu(-26); // -6
+					stp[1] = 115.0 * meter_deflect_vu(-23); // -3
+					stp[2] = 115.0 * meter_deflect_vu(-20); // 0
+					stp[3] = 115.0 * meter_deflect_vu(-18); // +2
+					c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = 0x00aa00ff;
+					c[6] = c[7] = c[8] = c[9] = 0xff8800ff;
+					break;
+				default: // PEAK, RMS
+					stp[1] = 77.5;  // 115 * log_meter(-10)
+					stp[2] = 92.5;  // 115 * log_meter(-3)
+					stp[3] = 100.0; // 115 * log_meter(0)
+				switch (Config->get_meter_line_up_level()) {
+					case MeteringLineUp24:
+						stp[0] = 42.0;
+						break;
+					case MeteringLineUp20:
+						stp[0] = 50.0;
+						break;
+					default:
+					case MeteringLineUp18:
+						stp[0] = 55.0;
+						break;
+					case MeteringLineUp15:
+						stp[0] = 62.5;
+						break;
+				}
+			}
 		}
-		if (meters[n].width != width || meters[n].length != len || color_changed) {
+		if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type) {
+			bool hl = meters[n].meter ? meters[n].meter->get_highlight() : false;
+			meters[n].packed = false;
 			delete meters[n].meter;
-			meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, b, m, t, c);
+			meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, _meter_orientation, len,
+					c[0], c[1], c[2], c[3], c[4],
+					c[5], c[6], c[7], c[8], c[9],
+					b[0], b[1], b[2], b[3],
+					stp[0], stp[1], stp[2], stp[3],
+					styleflags
+					);
+			meters[n].meter->set_highlight(hl);
 			meters[n].width = width;
 			meters[n].length = len;
 			meters[n].meter->add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
-			meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_press));
-			meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeter::meter_button_release));
+			meters[n].meter->signal_button_press_event().connect (sigc::mem_fun (*this, &LevelMeterBase::meter_button_press));
+			meters[n].meter->signal_button_release_event().connect (sigc::mem_fun (*this, &LevelMeterBase::meter_button_release));
 		}
 
-		pack_end (*meters[n].meter, false, false);
+		//pack_end (*meters[n].meter, false, false);
+		mtr_pack (*meters[n].meter);
 		meters[n].meter->show_all ();
 		meters[n].packed = true;
 	}
-	show();
+	//show();
 	color_changed = false;
+	visible_meter_type = meter_type;
+}
+
+void
+LevelMeterBase::set_type(MeterType t)
+{
+	meter_type = t;
+	_meter->set_type(t);
 }
 
 bool
-LevelMeter::meter_button_press (GdkEventButton* ev)
+LevelMeterBase::meter_button_press (GdkEventButton* ev)
 {
 	return ButtonPress (ev); /* EMIT SIGNAL */
 }
 
 bool
-LevelMeter::meter_button_release (GdkEventButton* ev)
+LevelMeterBase::meter_button_release (GdkEventButton* ev)
 {
 	if (ev->button == 1) {
-		clear_meters ();
+		clear_meters (false);
 	}
+	ButtonRelease(ev);
 
 	return true;
 }
 
 
-void LevelMeter::clear_meters ()
+void LevelMeterBase::clear_meters (bool reset_highlight)
 {
 	for (vector<MeterInfo>::iterator i = meters.begin(); i < meters.end(); i++) {
 		(*i).meter->clear();
+		(*i).max_peak = minus_infinity();
+		if (reset_highlight)
+			(*i).meter->set_highlight(false);
 	}
 	max_peak = minus_infinity();
 }
 
-void LevelMeter::hide_meters ()
+void LevelMeterBase::hide_meters ()
 {
 	hide_all_meters();
 }
 
 void
-LevelMeter::color_handler ()
+LevelMeterBase::color_handler ()
 {
 	color_changed = true;
+	setup_meters (meter_length, regular_meter_width, thin_meter_width);
 }
 
+LevelMeterHBox::LevelMeterHBox(Session* s)
+	: LevelMeterBase(s, invalidator(*this))
+{
+	set_spacing(1);
+	show();
+}
+
+
+LevelMeterHBox::~LevelMeterHBox() {}
+
+void
+LevelMeterHBox::mtr_pack(Gtk::Widget &w) {
+	pack_end (w, false, false);
+}
+
+void
+LevelMeterHBox::mtr_remove(Gtk::Widget &w) {
+	remove (w);
+}
+
+
+LevelMeterVBox::LevelMeterVBox(Session* s)
+	: LevelMeterBase(s, invalidator(*this), FastMeter::Horizontal)
+{
+	set_spacing(1);
+	show();
+}
+LevelMeterVBox::~LevelMeterVBox() {}
+
+void
+LevelMeterVBox::mtr_pack(Gtk::Widget &w) {
+	pack_end (w, false, false);
+}
+
+void
+LevelMeterVBox::mtr_remove(Gtk::Widget &w) {
+	remove (w);
+}
diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h
index 0e51758..a355d7d 100644
--- a/gtk2_ardour/level_meter.h
+++ b/gtk2_ardour/level_meter.h
@@ -37,6 +37,7 @@
 #include <gtkmm2ext/click_box.h>
 #include <gtkmm2ext/focus_entry.h>
 #include <gtkmm2ext/slider_controller.h>
+#include <gtkmm2ext/fastmeter.h>
 
 #include "enums.h"
 
@@ -44,18 +45,16 @@ namespace ARDOUR {
 	class Session;
 	class PeakMeter;
 }
-namespace Gtkmm2ext {
-	class FastMeter;
-}
 namespace Gtk {
 	class Menu;
 }
 
-class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
+class LevelMeterBase : public ARDOUR::SessionHandlePtr
 {
   public:
-	LevelMeter (ARDOUR::Session*);
-	~LevelMeter ();
+	LevelMeterBase (ARDOUR::Session*, PBD::EventLoop::InvalidationRecord* ir,
+			Gtkmm2ext::FastMeter::Orientation o = Gtkmm2ext::FastMeter::Vertical);
+	virtual ~LevelMeterBase ();
 
 	virtual void set_meter (ARDOUR::PeakMeter* meter);
 
@@ -63,15 +62,26 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 
 	float update_meters ();
 	void update_meters_falloff ();
-	void clear_meters ();
+	void clear_meters (bool reset_highlight = true);
 	void hide_meters ();
-	void setup_meters (int len=0, int width=3);
+	void setup_meters (int len=0, int width=3, int thin=2);
+
+	void set_type (ARDOUR::MeterType);
+	ARDOUR::MeterType get_type () { return meter_type; }
 
 	/** Emitted in the GUI thread when a button is pressed over the meter */
 	PBD::Signal1<bool, GdkEventButton *> ButtonPress;
+	PBD::Signal1<bool, GdkEventButton *> ButtonRelease;
+	PBD::Signal1<void, ARDOUR::MeterType> MeterTypeChanged;
+
+	protected:
+	virtual void mtr_pack(Gtk::Widget &w) = 0;
+	virtual void mtr_remove(Gtk::Widget &w) = 0;
 
   private:
+	PBD::EventLoop::InvalidationRecord* parent_invalidator;
 	ARDOUR::PeakMeter* _meter;
+	Gtkmm2ext::FastMeter::Orientation _meter_orientation;
 
 	Width _width;
 
@@ -80,22 +90,27 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 	    gint16                width;
             int			  length;
 	    bool                  packed;
+	    float                 max_peak;
 
 	    MeterInfo() {
 		    meter = 0;
 		    width = 0;
                     length = 0;
 		    packed = false;
+		    max_peak = -INFINITY;
 	    }
 	};
 
 	guint16                regular_meter_width;
 	int                    meter_length;
-	static const guint16   thin_meter_width = 2;
+	guint16                thin_meter_width;
 	std::vector<MeterInfo> meters;
 	float                  max_peak;
+	ARDOUR::MeterType      meter_type;
+	ARDOUR::MeterType      visible_meter_type;
 
 	PBD::ScopedConnection _configuration_connection;
+	PBD::ScopedConnection _meter_type_connection;
 	PBD::ScopedConnection _parameter_connection;
 
 	void hide_all_meters ();
@@ -104,6 +119,7 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 
 	void parameter_changed (std::string);
 	void configuration_changed (ARDOUR::ChanCount in, ARDOUR::ChanCount out);
+	void meter_type_changed (ARDOUR::MeterType);
 
 	void on_theme_changed ();
 	bool style_changed;
@@ -111,5 +127,27 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 	void color_handler ();
 };
 
+class LevelMeterHBox : public LevelMeterBase, public Gtk::HBox
+{
+  public:
+	LevelMeterHBox (ARDOUR::Session*);
+	~LevelMeterHBox();
+
+	protected:
+	void mtr_pack(Gtk::Widget &w);
+	void mtr_remove(Gtk::Widget &w);
+};
+
+class LevelMeterVBox : public LevelMeterBase, public Gtk::VBox
+{
+  public:
+	LevelMeterVBox (ARDOUR::Session*);
+	~LevelMeterVBox();
+
+	protected:
+	void mtr_pack(Gtk::Widget &w);
+	void mtr_remove(Gtk::Widget &w);
+};
+
 #endif /* __ardour_gtk_track_meter_h__ */
 
diff --git a/gtk2_ardour/location_ui.cc b/gtk2_ardour/location_ui.cc
index 30a5b62..92f11da 100644
--- a/gtk2_ardour/location_ui.cc
+++ b/gtk2_ardour/location_ui.cc
@@ -307,6 +307,10 @@ LocationEditRow::set_location (Location *loc)
 		end_clock.show();
 		length_clock.show();
 
+		if (location->is_cd_marker()) {
+			show_cd_track_details ();
+		}
+
 		ARDOUR_UI::instance()->set_tip (remove_button, _("Remove this range"));
 		ARDOUR_UI::instance()->set_tip (start_clock, _("Start time - middle click to locate here"));
 		ARDOUR_UI::instance()->set_tip (end_clock, _("End time - middle click to locate here"));
@@ -447,6 +451,34 @@ LocationEditRow::clock_changed (LocationPart part)
 }
 
 void
+LocationEditRow::show_cd_track_details ()
+{
+
+	if (location->cd_info.find("isrc") != location->cd_info.end()) {
+		isrc_entry.set_text(location->cd_info["isrc"]);
+	}
+	if (location->cd_info.find("performer") != location->cd_info.end()) {
+		performer_entry.set_text(location->cd_info["performer"]);
+	}
+	if (location->cd_info.find("composer") != location->cd_info.end()) {
+		composer_entry.set_text(location->cd_info["composer"]);
+	}
+	if (location->cd_info.find("scms") != location->cd_info.end()) {
+		scms_check_button.set_active(true);
+	}
+	if (location->cd_info.find("preemph") != location->cd_info.end()) {
+		preemph_check_button.set_active(true);
+	}
+
+
+	if (!cd_track_details_hbox.get_parent()) {
+		item_table.attach (cd_track_details_hbox, 0, 7, 1, 2, FILL | EXPAND, FILL, 4, 0);
+	}
+	// item_table.resize(2, 7);
+	cd_track_details_hbox.show_all();
+}
+
+void
 LocationEditRow::cd_toggled ()
 {
 	if (i_am_the_modifier || !location) {
@@ -469,27 +501,7 @@ LocationEditRow::cd_toggled ()
 
 	if (location->is_cd_marker() && !(location->is_mark())) {
 
-		if (location->cd_info.find("isrc") != location->cd_info.end()) {
-			isrc_entry.set_text(location->cd_info["isrc"]);
-		}
-		if (location->cd_info.find("performer") != location->cd_info.end()) {
-			performer_entry.set_text(location->cd_info["performer"]);
-		}
-		if (location->cd_info.find("composer") != location->cd_info.end()) {
-			composer_entry.set_text(location->cd_info["composer"]);
-		}
-		if (location->cd_info.find("scms") != location->cd_info.end()) {
-			scms_check_button.set_active(true);
-		}
-		if (location->cd_info.find("preemph") != location->cd_info.end()) {
-			preemph_check_button.set_active(true);
-		}
-
-		if (!cd_track_details_hbox.get_parent()) {
-			item_table.attach (cd_track_details_hbox, 0, 7, 1, 2, FILL | EXPAND, FILL, 4, 0);
-		}
-		// item_table.resize(2, 7);
-		cd_track_details_hbox.show_all();
+		show_cd_track_details ();
 
 	} else if (cd_track_details_hbox.get_parent()){
 
@@ -1153,8 +1165,7 @@ LocationUIWindow::on_map ()
 bool
 LocationUIWindow::on_delete_event (GdkEventAny*)
 {
-	hide ();
-	return true;
+	return false;
 }
 
 void
@@ -1162,6 +1173,7 @@ LocationUIWindow::set_session (Session *s)
 {
 	ArdourWindow::set_session (s);
 	_ui.set_session (s);
+	_ui.show_all ();
 }
 
 void
diff --git a/gtk2_ardour/location_ui.h b/gtk2_ardour/location_ui.h
index b01b63e..395464e 100644
--- a/gtk2_ardour/location_ui.h
+++ b/gtk2_ardour/location_ui.h
@@ -140,6 +140,7 @@ class LocationEditRow  : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 	void position_lock_style_changed (ARDOUR::Location *);
 
 	void set_clock_editable_status ();
+	void show_cd_track_details ();
 
 	PBD::ScopedConnectionList connections;
 };
diff --git a/gtk2_ardour/logmeter.h b/gtk2_ardour/logmeter.h
index d861509..a244fb4 100644
--- a/gtk2_ardour/logmeter.h
+++ b/gtk2_ardour/logmeter.h
@@ -34,7 +34,17 @@ alt_log_meter (float power)
 }
 #endif
 
-inline float
+/* prototypes - avoid compiler warning */
+static inline float log_meter (float db);
+static inline float meter_deflect_ppm (float);
+static inline float meter_deflect_din (float);
+static inline float meter_deflect_nordic (float);
+static inline float meter_deflect_vu (float);
+static inline float meter_deflect_k (float, float);
+
+
+
+static inline float
 log_meter (float db)
 {
          gfloat def = 0.0f; /* Meter deflection %age */
@@ -65,4 +75,71 @@ log_meter (float db)
          return def/115.0f;
 }
 
+static inline float
+meter_deflect_ppm (float db)
+{
+	if (db < -30) {
+		// 2.258 == ((-30 + 32.0)/ 28.0) / 10^(-30 / 20);
+		return (dB_to_coefficient(db) * 2.258769757f);
+	} else {
+		const float rv = (db + 32.0f) / 28.0f;
+		if (rv < 1.0) {
+			return rv;
+		} else {
+			return 1.0;
+		}
+	}
+}
+
+static inline float
+meter_deflect_din (float db)
+{
+	float rv = dB_to_coefficient(db);
+	rv = sqrtf (sqrtf (2.3676f * rv)) - 0.1803f;
+	if (rv >= 1.0) {
+		return 1.0;
+	} else {
+		return (rv > 0 ? rv : 0.0);
+	}
+}
+
+static inline float
+meter_deflect_nordic (float db)
+{
+	if (db < -60) {
+		return 0.0;
+	} else {
+		const float rv = (db + 60.0f) / 54.0f;
+		if (rv < 1.0) {
+			return rv;
+		} else {
+			return 1.0;
+		}
+	}
+}
+
+static inline float
+meter_deflect_vu (float db)
+{
+	const float rv = 6.77165f * dB_to_coefficient(db);
+	if (rv > 1.0) return 1.0;
+	return rv;
+}
+
+static inline float
+meter_deflect_k (float db, float krange)
+{
+	db+=krange;
+	if (db < -40.0f) {
+		return (dB_to_coefficient(db) * 500.0f / (krange + 45.0f));
+	} else {
+		const float rv = (db + 45.0f) / (krange + 45.0f);
+		if (rv < 1.0) {
+			return rv;
+		} else {
+			return 1.0;
+		}
+	}
+}
+
 #endif /* __ardour_gtk_log_meter_h__ */
diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc
index 839bc6a..f9b1571 100644
--- a/gtk2_ardour/lv2_plugin_ui.cc
+++ b/gtk2_ardour/lv2_plugin_ui.cc
@@ -144,7 +144,7 @@ LV2PluginUI::start_updating(GdkEventAny*)
 {
 	if (!_output_ports.empty()) {
 		_screen_update_connection.disconnect();
-		_screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
+		_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
 		        (sigc::mem_fun(*this, &LV2PluginUI::output_update));
 	}
 	return false;
@@ -184,11 +184,19 @@ LV2PluginUI::LV2PluginUI(boost::shared_ptr<PluginInsert> pi,
 	, _pi(pi)
 	, _lv2(lv2p)
 	, _gui_widget(NULL)
-	, _ardour_buttons_box(NULL)
 	, _values(NULL)
 	, _external_ui_ptr(NULL)
 	, _inst(NULL)
 {
+	_ardour_buttons_box.set_spacing (6);
+	_ardour_buttons_box.set_border_width (6);
+	_ardour_buttons_box.pack_end (focus_button, false, false);
+	_ardour_buttons_box.pack_end (bypass_button, false, false, 10);
+	_ardour_buttons_box.pack_end (delete_button, false, false);
+	_ardour_buttons_box.pack_end (save_button, false, false);
+	_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);
 }
 
 void
@@ -219,18 +227,11 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
 		features[features_count - 1] = &_external_ui_feature;
 		features[features_count]     = NULL;
 	} else {
-		_ardour_buttons_box = manage (new Gtk::HBox);
-		_ardour_buttons_box->set_spacing (6);
-		_ardour_buttons_box->set_border_width (6);
-		_ardour_buttons_box->pack_end (focus_button, false, false);
-		_ardour_buttons_box->pack_end (bypass_button, false, false, 10);
-		_ardour_buttons_box->pack_end (delete_button, false, false);
-		_ardour_buttons_box->pack_end (save_button, false, false);
-		_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->show_all();
-		pack_start(*_ardour_buttons_box, false, false);
+		if (_ardour_buttons_box.get_parent()) {
+			_ardour_buttons_box.get_parent()->remove(_ardour_buttons_box);
+		}
+		pack_start(_ardour_buttons_box, false, false);
+		_ardour_buttons_box.show_all();
 
 		_gui_widget = Gtk::manage((container = new Gtk::Alignment()));
 		pack_start(*_gui_widget, true, true);
@@ -322,7 +323,7 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
 
 	if (_lv2->has_message_output()) {
 		_lv2->enable_ui_emmission();
-		ARDOUR_UI::instance()->RapidScreenUpdate.connect(
+		ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
 			sigc::mem_fun(*this, &LV2PluginUI::update_timeout));
 	}
 }
@@ -432,7 +433,7 @@ LV2PluginUI::on_window_show(const std::string& title)
 
 		LV2_EXTERNAL_UI_SHOW(_external_ui_ptr);
 		_screen_update_connection.disconnect();
-		_screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
+		_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
 		        (sigc::mem_fun(*this, &LV2PluginUI::output_update));
 		return false;
 	} else {
diff --git a/gtk2_ardour/lv2_plugin_ui.h b/gtk2_ardour/lv2_plugin_ui.h
index 9bf8c3d..edb90cb 100644
--- a/gtk2_ardour/lv2_plugin_ui.h
+++ b/gtk2_ardour/lv2_plugin_ui.h
@@ -73,7 +73,7 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox
 	sigc::connection                     _screen_update_connection;
 	Gtk::Widget*                         _gui_widget;
 	/** a box containing the focus, bypass, delete, save / add preset buttons etc. */
-	Gtk::HBox*                           _ardour_buttons_box;
+	Gtk::HBox                            _ardour_buttons_box;
 	float*                               _values;
 	std::vector<ControllableRef>         _controllables;
 	struct lv2_external_ui_host          _external_ui_host;
diff --git a/gtk2_ardour/lxvst_plugin_ui.h b/gtk2_ardour/lxvst_plugin_ui.h
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/marker_time_axis.cc b/gtk2_ardour/marker_time_axis.cc
deleted file mode 100644
index dd827b4..0000000
--- a/gtk2_ardour/marker_time_axis.cc
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
-    Copyright (C) 2003 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 "pbd/error.h"
-
-#include <gtkmm/menu.h>
-
-#include <gtkmm2ext/utils.h>
-
-#include "ardour/session.h"
-#include "ardour/utils.h"
-
-#include "ardour_ui.h"
-#include "public_editor.h"
-#include "imageframe_time_axis.h"
-#include "selection.h"
-#include "imageframe_time_axis_view.h"
-#include "marker_time_axis_view.h"
-#include "imageframe_view.h"
-#include "marker_time_axis.h"
-#include "canvas_impl.h"
-
-#include "i18n.h"
-
-using namespace ARDOUR;
-using namespace PBD;
-using namespace Gtk;
-
-//---------------------------------------------------------------------------------------//
-// Constructor / Desctructor
-
-/**
- * Constructs a new MarkerTimeAxis
- *
- * @param ed the PublicEditor
- * @param sess the current session
- * @param canvas the parent canvas item
- * @param name the name/id of this time axis
- * @param tav the associated track view that this MarkerTimeAxis is marking up
- */
-MarkerTimeAxis::MarkerTimeAxis (PublicEditor& ed, ARDOUR::Session* sess, Canvas& canvas, const string & name, TimeAxisView* tav)
-	: AxisView(sess),
-	  VisualTimeAxis(name, ed, sess, canvas)
-{
-	/* the TimeAxisView these markers are associated with */
-	marked_time_axis = tav ;
-
-	_color = unique_random_color() ;
-	time_axis_name = name ;
-
-	selection_group = new Group (*canvas_display);
-	selection_group->hide();
-
-	// intialize our data items
-	marker_menu = 0 ;
-
-	y_position = -1 ;
-
-	/* create our new marker time axis strip view */
-	view = new MarkerTimeAxisView(*this) ;
-
-	// set the initial time axis text label
-	label_view() ;
-
-	// set the initial height of this time axis
-	set_height(hSmall) ;
-}
-
-/**
- * Destructor
- * Responsible for destroying any marker items upon this time axis
- */
-MarkerTimeAxis::~MarkerTimeAxis()
-{
-	CatchDeletion (this); /* EMIT_SIGNAL */
-
-	// destroy the view helper
-	// this handles removing and destroying individual marker items
-
-	if(view) {
-		delete view ;
-		view = 0 ;
-	}
-}
-
-
-//---------------------------------------------------------------------------------------//
-// ui methods & data
-
-void
-MarkerTimeAxis::set_height (uint32_t h)
-{
-	VisualTimeAxis::set_height(h) ;
-
-	// tell out view helper of the change too
-	if (view != 0)
-	{
-		view->set_height((double) height) ;
-	}
-
-	// tell those interested that we have had our height changed
-	gui_changed("track_height",(void*)0) ; /* EMIT_SIGNAL */
-}
-
-/**
- * Sets the number of samples per unit that are used.
- * This is used to determine the sizes of items upon this time axis
- *
- * @param spu the number of samples per unit
- */
-void
-MarkerTimeAxis::set_samples_per_unit(double spu)
-{
-	TimeAxisView::set_samples_per_unit (editor.get_current_zoom());
-
-	if (view) {
-		view->set_samples_per_unit(spu) ;
-	}
-}
-
-/**
- * Show the popup edit menu
- *
- * @param button the mouse button pressed
- * @param time when to show the popup
- * @param clicked_mv the MarkerView that the event ocured upon, or 0 if none
- * @param with_item true if an item has been selected upon the time axis, used to set context menu
- */
-void
-MarkerTimeAxis::popup_marker_time_axis_edit_menu(int button, int32_t time, MarkerView* clicked_mv, bool with_item)
-{
-	if (!marker_menu)
-	{
-		build_marker_menu() ;
-	}
-
-	if (with_item)
-	{
-		marker_item_menu->set_sensitive(true) ;
-	}
-	else
-	{
-		marker_item_menu->set_sensitive(false) ;
-	}
-
-	marker_menu->popup(button,time) ;
-}
-
-
-/**
- * convenience method to select a new track color and apply it to the view and view items
- *
- */
-void
-MarkerTimeAxis::select_track_color()
-{
-	if(VisualTimeAxis::choose_time_axis_color())
-	{
-		if(view)
-		{
-			view->apply_color(_color) ;
-		}
-	}
-}
-
-/**
- * Handles the building of the popup menu
- */
-void
-MarkerTimeAxis::build_display_menu()
-{
-	using namespace Menu_Helpers;
-
-	/* get the size menu ready */
-	build_size_menu() ;
-
-	/* prepare it */
-	TimeAxisView::build_display_menu();
-
-	/* now fill it with our stuff */
-	MenuList& items = display_menu->items();
-
-	items.push_back(MenuElem (_("Rename"), sigc::mem_fun(*this, &VisualTimeAxis::start_time_axis_rename)));
-
-	items.push_back(SeparatorElem()) ;
-	items.push_back(MenuElem (_("Height"), *size_menu));
-	items.push_back(MenuElem (_("Color"), sigc::mem_fun(*this, &MarkerTimeAxis::select_track_color)));
-	items.push_back(SeparatorElem()) ;
-
-	items.push_back(MenuElem (_("Remove"), sigc::bind(sigc::mem_fun(*this, &MarkerTimeAxis::remove_this_time_axis), (void*)this)));
-}
-
-/**
- * handles the building of the MarkerView sub menu
- */
-void
-MarkerTimeAxis::build_marker_menu()
-{
-	using namespace Menu_Helpers;
-	using Gtk::Menu;
-
-	marker_menu = manage(new Menu) ;
-	marker_menu->set_name ("ArdourContextMenu");
-	MenuList& items = marker_menu->items();
-
-	marker_item_menu = manage(new Menu) ;
-	marker_item_menu->set_name ("ArdourContextMenu");
-	MenuList& marker_sub_items = marker_item_menu->items() ;
-
-	/* duration menu */
-	Menu* duration_menu = manage(new Menu) ;
-	duration_menu->set_name ("ArdourContextMenu");
-	MenuList& duration_items = duration_menu->items() ;
-
-	if(view)
-	{
-		duration_items.push_back(MenuElem (_("1 seconds"), sigc::bind (sigc::mem_fun (view, &MarkerTimeAxisView::set_marker_duration_sec), 1.0))) ;
-		duration_items.push_back(MenuElem (_("1.5 seconds"), sigc::bind (sigc::mem_fun (view, &MarkerTimeAxisView::set_marker_duration_sec), 1.5))) ;
-		duration_items.push_back(MenuElem (_("2 seconds"), sigc::bind (sigc::mem_fun (view, &MarkerTimeAxisView::set_marker_duration_sec), 2.0))) ;
-		duration_items.push_back(MenuElem (_("2.5 seconds"), sigc::bind (sigc::mem_fun (view, &MarkerTimeAxisView::set_marker_duration_sec), 2.5))) ;
-		duration_items.push_back(MenuElem (_("3 seconds"), sigc::bind (sigc::mem_fun (view, &MarkerTimeAxisView::set_marker_duration_sec), 3.0))) ;
-	}
-	//duration_items.push_back(SeparatorElem()) ;
-	//duration_items.push_back(MenuElem (_("custom"), sigc::mem_fun(*this, &ImageFrameTimeAxis::set_marker_duration_custom))) ;
-
-	marker_sub_items.push_back(MenuElem(_("Duration (sec)"), *duration_menu)) ;
-
-	marker_sub_items.push_back(SeparatorElem()) ;
-	marker_sub_items.push_back(MenuElem (_("Remove Marker"), sigc::bind(sigc::mem_fun(view, &MarkerTimeAxisView::remove_selected_marker_view),(void*)this))) ;
-
-	items.push_back(MenuElem(_("Marker"), *marker_item_menu)) ;
-	items.push_back(MenuElem (_("Rename Track"), sigc::mem_fun(*this,&MarkerTimeAxis::start_time_axis_rename))) ;
-
-	marker_menu->show_all() ;
-}
-
-
-
-/**
- * Returns the view helper of this TimeAxis
- *
- * @return the view helper of this TimeAxis
- */
-MarkerTimeAxisView*
-MarkerTimeAxis::get_view()
-{
-	return(view) ;
-}
-
-/**
- * Returns the TimeAxisView that this markerTimeAxis is marking up
- *
- * @return the TimeAXisView that this MarkerTimeAxis is marking
- */
-TimeAxisView*
-MarkerTimeAxis::get_marked_time_axis()
-{
-	return(marked_time_axis) ;
-}
-
-
-
-
diff --git a/gtk2_ardour/marker_time_axis.h b/gtk2_ardour/marker_time_axis.h
deleted file mode 100644
index bb30bc2..0000000
--- a/gtk2_ardour/marker_time_axis.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
-    Copyright (C) 2003 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_marker_time_axis_h__
-#define __ardour_marker_time_axis_h__
-
-#include <string>
-#include <libgnomecanvas/libgnomecanvas.h>
-
-#include "ardour_dialog.h"
-#include "route_ui.h"
-#include "enums.h"
-#include "time_axis_view.h"
-#include "canvas.h"
-#include "visual_time_axis.h"
-
-namespace ARDOUR {
-	class Session;
-}
-
-class PublicEditor;
-class ImageFrameView ;
-class ImageFrameTimeAxisView ;
-class MarkerTimeAxisView ;
-class MarkerView ;
-
-/**
- * MarkerTimeAxis defines a visual time axis for holding marker items associated with other time axis, and time axis items.
- *
- * The intention of this time axis is to allow markers with duration to be arranged on the time line
- * to add additional timing information to items on an associated time axis, for instance the addition
- * of effect duration and timings
- */
-class MarkerTimeAxis : public VisualTimeAxis
-{
-	public:
-		//---------------------------------------------------------------------------------------//
-		// Constructor / Desctructor
-
-		/**
-		 * Constructs a new MarkerTimeAxis
-		 *
-		 * @param ed the PublicEditor
-		 * @param sess the current session
-		 * @param canvas the parent canvas item
-		 * @param name the name/id of this time axis
-		 * @param tav the associated track view that this MarkerTimeAxis is marking up
-		 */
-		MarkerTimeAxis(PublicEditor& ed, ARDOUR::Session* sess, ArdourCanvas::Canvas& canvas, const std::string & name, TimeAxisView* tav) ;
-
-		/**
-		 * Destructor
-		 * Responsible for destroying any marker items upon this time axis
-		 */
-		virtual ~MarkerTimeAxis() ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// ui methods & data
-
-		/**
-		 * Sets the height of this TrackView to one of the defined TrackHeights
-		 *
-		 * @param h the number of pixels to set the height to
-		 */
-		virtual void set_height(uint32_t h) ;
-
-		/**
-		 * Sets the number of samples per unit that are used.
-		 * This is used to determine the sizes of items upon this time axis
-		 *
-		 * @param spu the number of samples per unit
-		 */
-		virtual void set_samples_per_unit(double spu) ;
-
-
-		/**
-		 * Show the popup edit menu
-		 *
-		 * @param button the mouse button pressed
-		 * @param time when to show the popup
-		 * @param clicked_mv the MarkerView that the event ocured upon, or 0 if none
-		 * @param with_item true if an item has been selected upon the time axis, used to set context menu
-		 */
-		void popup_marker_time_axis_edit_menu(int button, int32_t time, MarkerView* clicked_mv, bool with_item) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Parent/Child helper object accessors
-
-		/**
-		 * Returns the view helper of this TimeAxis
-		 *
-		 * @return the view helper of this TimeAxis
-		 */
-		MarkerTimeAxisView* get_view() ;
-
-		/**
-		 * Returns the TimeAxisView that this markerTimeAxis is marking up
-		 *
-		 * @return the TimeAXisView that this MarkerTimeAxis is marking
-		 */
-		TimeAxisView* get_marked_time_axis() ;
-
-
-	private:
-
-		/**
-		 * convenience method to select a new track color and apply it to the view and view items
-		 *
-		 */
-		void select_track_color() ;
-
-		/**
-		 * Handles the building of the popup menu
-		 */
-		virtual void build_display_menu() ;
-
-		/**
-		 * handles the building of the MarkerView sub menu
-		 */
-		void build_marker_menu() ;
-
-		/** The associated TimeAxis that this MarkerTimeAxis is marking up */
-		TimeAxisView* marked_time_axis ;
-
-		/** Our time axis view helper */
-		MarkerTimeAxisView *view ;
-
-		/** the popup menu available by clicking upon this time axis */
-		Gtk::Menu *marker_menu ;
-
-		/** specialized sub menu available when clicking upon and item upon this time axis */
-		Gtk::Menu *marker_item_menu ;
-
-
-} ; /* class MarkerTimeAxis */
-
-#endif /* __ardour_imageframe_time_axis_h__ */
-
diff --git a/gtk2_ardour/marker_time_axis_view.cc b/gtk2_ardour/marker_time_axis_view.cc
deleted file mode 100644
index b1eb706..0000000
--- a/gtk2_ardour/marker_time_axis_view.cc
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
-    Copyright (C) 2003 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 <algorithm>
-
-#include <gtkmm.h>
-#include <gtkmm2ext/gtk_ui.h>
-
-#include "marker_time_axis_view.h"
-#include "marker_time_axis.h"
-#include "marker_view.h"
-#include "imageframe_view.h"
-#include "imageframe_time_axis.h"
-#include "canvas-simplerect.h"
-#include "public_editor.h"
-#include "rgb_macros.h"
-#include "gui_thread.h"
-#include "ardour_ui.h"
-
-#include "i18n.h"
-
-using namespace ARDOUR ;
-using namespace Editing;
-
-//---------------------------------------------------------------------------------------//
-// Constructor / Desctructor
-
-/**
- * Construct a new MarkerTimeAxisView helper time axis helper
- *
- * @param mta the TimeAxsiView that this objbect is the helper for
- */
-MarkerTimeAxisView::MarkerTimeAxisView(MarkerTimeAxis& tv)
-	: _trackview (tv)
-{
-	region_color = _trackview.color();
-	stream_base_color = ARDOUR_UI::config()->canvasvar_MarkerTrack.get();
-
-	canvas_group = new ArdourCanvas::Group (*_trackview.canvas_display);
-
-	canvas_rect =  new ArdourCanvas::SimpleRect (*canvas_group);
-	canvas_rect->property_x1() = 0.0;
-	canvas_rect->property_y1() = 0.0;
-	canvas_rect->property_x2() = max_framepos;
-	canvas_rect->property_y2() = (double)20;
-	canvas_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerTrack.get();
-	canvas_rect->property_fill_color_rgba() = stream_base_color;
-
-	canvas_rect->signal_event().connect (sigc::bind (sigc::mem_fun (_trackview.editor, &PublicEditor::canvas_marker_time_axis_view_event), canvas_rect, &_trackview));
-
-	_samples_per_unit = _trackview.editor.get_current_zoom() ;
-
-	_trackview.editor.ZoomChanged.connect (sigc::mem_fun(*this, &MarkerTimeAxisView::reset_samples_per_unit));
-	MarkerView::CatchDeletion.connect (*this, boost::bind (&MarkerTimeAxisView::remove_marker_view, this, _1), gui_context());
-}
-
-/**
- * Destructor
- * Reposinsibly for destroying all marker items that may have been added to this time axis view
- *
- */
-MarkerTimeAxisView::~MarkerTimeAxisView()
-{
-	// destroy everything upon this view
-	for(MarkerViewList::iterator iter = marker_view_list.begin(); iter != marker_view_list.end(); ++iter)
-	{
-		MarkerView* mv = (*iter) ;
-
-		MarkerViewList::iterator next = iter ;
-		next++ ;
-		marker_view_list.erase(iter) ;
-
-		delete mv ;
-		mv = 0 ;
-
-		iter = next ;
-	}
-
-	delete canvas_rect;
-	canvas_rect = 0 ;
-
-	delete canvas_group;
-	canvas_group = 0 ;
-}
-
-
-//---------------------------------------------------------------------------------------//
-// ui methods & data
-
-/**
- * Sets the height of the time axis view and the item upon it
- *
- * @param height the new height
- */
-int
-MarkerTimeAxisView::set_height(gdouble h)
-{
-	if (h < 10.0 || h > 1000.0) {
-		return -1;
-	}
-
-	canvas_rect->property_y2() = h;
-
-	for (MarkerViewList::iterator i = marker_view_list.begin(); i != marker_view_list.end(); ++i) {
-		(*i)->set_y_position_and_height(0, h);
-	}
-
-	return 0;
-}
-
-/**
- * Sets the position of this view helper on the canvas
- *
- * @param x the x position upon the canvas
- * @param y the y position upon the canvas
- */
-int
-MarkerTimeAxisView::set_position(gdouble x, gdouble y)
-{
-	canvas_group->property_x() = x;
-	canvas_group->property_y() = y;
-	return 0;
-}
-
-/**
- * Sets the current samples per unit.
- * this method tells each item upon the time axis of the change
- *
- * @param spu the new samples per canvas unit value
- */
-int
-MarkerTimeAxisView::set_samples_per_unit(gdouble spp)
-{
-	if(spp < 1.0) {
-		return -1 ;
-	}
-
-	_samples_per_unit = spp ;
-
-	for(MarkerViewList::iterator i = marker_view_list.begin(); i != marker_view_list.end(); ++i)
-	{
-		(*i)->set_samples_per_unit(spp) ;
-	}
-	return(0) ;
-}
-
-/**
- * Sets the color of the items contained upon this view helper
- *
- * @param color the new base color
- */
-void
-MarkerTimeAxisView::apply_color(Gdk::Color& color)
-{
-	region_color = color;
-
-	for (MarkerViewList::iterator i = marker_view_list.begin(); i != marker_view_list.end(); i++)
-	{
-		(*i)->set_color (region_color) ;
-	}
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Child MarkerView Accessors/Mutators
-
-/**
- * Adds a marker view to the list of items upon this time axis view helper
- * the new MarkerView is returned
- *
- * @param ifv the ImageFrameView that the new item is marking up
- * @param mark_text the text to be displayed uopn the new marker item
- * @param mark_id the unique id of the new item
- * @param start the position the new item should be placed upon the time line
- * @param duration the duration the new item should be placed upon the timeline
- * @param src the identity of the object that initiated the change
- */
-MarkerView*
-MarkerTimeAxisView::add_marker_view(ImageFrameView* ifv, std::string mark_type, std::string mark_id, framepos_t start, framecnt_t dur, void* src)
-{
-	if(ifv->has_marker_view_item(mark_id))
-	{
-		return(0) ;
-	}
-
-	MarkerView* mv = new MarkerView(canvas_group,
-		 &_trackview,
-		 ifv,
-		 _trackview.editor.get_current_zoom(),
-		 region_color,
-		 mark_type,
-		 mark_id,
-		 start,
-		 dur) ;
-
-	ifv->add_marker_view_item(mv, src) ;
-	marker_view_list.push_front(mv) ;
-
-	MarkerViewAdded(mv,src) ; /* EMIT_SIGNAL */
-
-	return(mv) ;
-}
-
-/**
- * Returns the named MarkerView or 0 if the named marker does not exist
- *
- * @param item_id the unique id of the item to search for
- * @return the named MarkerView, or 0 if it is not held upon this view
- */
-MarkerView*
-MarkerTimeAxisView::get_named_marker_view(std::string item_id)
-{
-	MarkerView* mv =  0 ;
-
-	for(MarkerViewList::iterator i = marker_view_list.begin(); i != marker_view_list.end(); ++i)
-	{
-		if(((MarkerView*)*i)->get_item_name() == item_id)
-		{
-			mv = ((MarkerView*)*i) ;
-			break ;
-		}
-	}
-	return(mv) ;
-}
-
-/**
- * Removes the currently selected MarverView
- * Note that this method actually destroys the MarkerView too.
- * We assume that since we own the object, we are allowed to do this
- *
- * @param src the identity of the object that initiated the change
- * @see add_marker_view
- */
-void
-MarkerTimeAxisView::remove_selected_marker_view(void* src)
-{
-	std::string removed ;
-
-	if (selected_time_axis_item)
-	{
-		MarkerViewList::iterator i ;
-		if((i = find (marker_view_list.begin(), marker_view_list.end(), selected_time_axis_item)) != marker_view_list.end())
-		{
-			marker_view_list.erase(i) ;
-
-			 MarkerViewRemoved(selected_time_axis_item->get_item_name(),src) ; /* EMIT_SIGNAL */
-
-			delete(selected_time_axis_item) ;
-			selected_time_axis_item = 0 ;
-		}
-	}
-	else
-	{
-		//No selected marker view
-	}
-}
-
-/**
- * Removes and returns the named MarkerView from the list of MarkerView held by this view helper
- *
- * @param item_id the MarkerView unique id to remove
- * @param src the identity of the object that initiated the change
- * @see add_marker_view
- */
-MarkerView*
-MarkerTimeAxisView::remove_named_marker_view(std::string item_id, void* src)
-{
-	MarkerView* mv = 0 ;
-
-	MarkerViewList::iterator i = marker_view_list.begin() ;
-
-	for(MarkerViewList::iterator iter = marker_view_list.begin(); iter != marker_view_list.end(); ++iter)
-	{
-		if(((MarkerView*)*i)->get_item_name() == item_id)
-		{
-			mv = ((MarkerView*)*i) ;
-			marker_view_list.erase(i) ;
-
-			 MarkerViewRemoved(mv->get_item_name(), src) ; /* EMIT_SIGNAL */
-
-			// break from the for loop
-			break;
-		}
-		i++ ;
-	}
-
-	return(mv) ;
-}
-
-/**
- * Removes mv from the list of MarkerView upon this TimeAxis
- *
- * @param mv the MarkerView to remove
- * @param src the identity of the object that initiated the change
- */
-void
-MarkerTimeAxisView::remove_marker_view (MarkerView* mv)
-{
-	ENSURE_GUI_THREAD (*this, &MarkerTimeAxisView::remove_marker_view, mv, src)
-
-	MarkerViewList::iterator i;
-
-	if((i = find (marker_view_list.begin(), marker_view_list.end(), mv)) != marker_view_list.end()) {
-		marker_view_list.erase(i) ;
-
-		// Assume this remove happened locally, else use remove_named_marker_time_axis
-		// let listeners know that the named MarkerTimeAxis has been removed
-		 MarkerViewRemoved(mv->get_item_name(), src) ; /* EMIT_SIGNAL */
-	}
-}
-
-/**
- * Sets the duration of the selected MarkerView to the specified number of seconds
- *
- * @param sec the duration to set the MArkerView to, in seconds
- */
-void
-MarkerTimeAxisView::set_marker_duration_sec(double sec)
-{
-  if(get_selected_time_axis_item() != 0)
-  {
-	  get_selected_time_axis_item()->set_duration((sec * _trackview.editor.session()->frame_rate()), this);
-  }
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Selected item methods
-
-/**
- * Sets the currently selected item upon this time axis
- *
- * @param mv the item to set selected
- */
-void
-MarkerTimeAxisView::set_selected_time_axis_item(MarkerView* mv)
-{
-	selected_time_axis_item = mv ;
-}
-
-/**
- * Clears any selected item upon this time axis
- *
- */
-void
-MarkerTimeAxisView::clear_selected_time_axis_item()
-{
-	selected_time_axis_item = 0 ;
-}
-
-/**
- * Returnsthe currently selected item upon this time axis
- *
- * @return the currently selected item pon this time axis
- */
-MarkerView*
-MarkerTimeAxisView::get_selected_time_axis_item()
-{
-	return(selected_time_axis_item) ;
-}
-
-
-
-
-/**
- * convenience method to re-get the samples per unit and tell items upon this view
- *
- */
-void
-MarkerTimeAxisView::reset_samples_per_unit ()
-{
-	set_samples_per_unit(_trackview.editor.get_current_zoom()) ;
-}
diff --git a/gtk2_ardour/marker_time_axis_view.h b/gtk2_ardour/marker_time_axis_view.h
deleted file mode 100644
index caf0221..0000000
--- a/gtk2_ardour/marker_time_axis_view.h
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
-    Copyright (C) 2003 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_marker_time_axis_view_h__
-#define __ardour_marker_time_axis_view_h__
-
-#include <list>
-#include <gdkmm/color.h>
-#include <libgnomecanvasmm/group.h>
-
-#include "ardour/location.h"
-#include "simplerect.h"
-#include "canvas.h"
-
-class PublicEditor;
-class MarkerTimeAxis;
-class ImageFrameView ;
-class MarkerView ;
-class TimeAxisView ;
-class TimeAxisViewItem ;
-
-/**
- * A view helper for handling MarkerView objects.
- * This object is responsible for the time axis canvas view, and
- * maintains the list of items that have been added to it
- */
-class MarkerTimeAxisView : public sigc::trackable
-{
-	public:
-		//---------------------------------------------------------------------------------------//
-		// Constructor / Desctructor
-
-		/**
-		 * Construct a new MarkerTimeAxisView helper time axis helper
-		 *
-		 * @param mta the TimeAxsiView that this objbect is the helper for
-		 */
-		MarkerTimeAxisView(MarkerTimeAxis& mta) ;
-
-		/**
-		 * Destructor
-		 * Reposinsibly for destroying all marker items that may have been added to this time axis view
-		 *
-		 */
-		~MarkerTimeAxisView () ;
-
-		//---------------------------------------------------------------------------------------//
-		// Parent/Child helper object accessors
-
-		/**
-		 * Returns the TimeAxisView thatt his object is acting as a helper for
-		 *
-		 * @return the TimeAxisView that this object is acting as a view helper for
-		 */
-		MarkerTimeAxis& trackview() { return _trackview; }
-
-		/**
-		 *
-		 */
-		ArdourCanvas::Item *canvas_item() { return canvas_group; }
-
-
-		//---------------------------------------------------------------------------------------//
-		// ui methods & data
-
-		/**
-		 * Sets the height of the time axis view and the item upon it
-		 *
-		 * @param height the new height
-		 */
-		int set_height(gdouble height) ;
-
-		/**
-		 * Sets the position of this view helper on the canvas
-		 *
-		 * @param x the x position upon the canvas
-		 * @param y the y position upon the canvas
-		 */
-		int set_position(gdouble x, gdouble y) ;
-
-		/**
-		 * Sets the current samples per unit.
-		 * this method tells each item upon the time axis of the change
-		 *
-		 * @param spu the new samples per canvas unit value
-		 */
-		int set_samples_per_unit(gdouble spu) ;
-
-		/**
-		 * Returns the current samples per unit of this time axis view helper
-		 *
-		 * @return the current samples per unit of this time axis view helper
-		 */
-		gdouble get_samples_per_unit() { return _samples_per_unit; }
-
-		/**
-		 * Sets the color of the items contained upon this view helper
-		 *
-		 * @param color the new base color
-		 */
-		void apply_color(Gdk::Color& color) ;
-
-		//---------------------------------------------------------------------------------------//
-		// Child MarkerView Accessors/Mutators
-
-		/**
-		 * Adds a marker view to the list of items upon this time axis view helper
-		 * the new MarkerView is returned
-		 *
-		 * @param ifv the ImageFrameView that the new item is marking up
-		 * @param mark_text the text to be displayed uopn the new marker item
-		 * @param mark_id the unique id of the new item
-		 * @param start the position the new item should be placed upon the time line
-		 * @param duration the duration the new item should be placed upon the timeline
-		 * @param src the identity of the object that initiated the change
-		 */
-		MarkerView* add_marker_view(ImageFrameView* ifv, std::string mark_type, std::string mark_id, nframes_t start, nframes_t dur, void* src) ;
-
-		/**
-		 * Returns the named MarkerView or 0 if the named marker does not exist
-		 *
-		 * @param item_id the unique id of the item to search for
-		 * @return the named MarkerView, or 0 if it is not held upon this view
-		 */
-		MarkerView* get_named_marker_view(std::string item_id) ;
-
-		/**
-		 * Removes the currently selected MarverView
-		 * Note that this method actually destroys the MarkerView too.
-		 * We assume that since we own the object, we are allowed to do this
-		 *
-		 * @param src the identity of the object that initiated the change
-		 * @see add_marker_view
-		 */
-		void remove_selected_marker_view(void* src) ;
-
-		/**
-		 * Removes and returns the named MarkerView from the list of MarkerView held by this view helper
-		 *
-		 * @param item_id the MarkerView unique id to remove
-		 * @param src the identity of the object that initiated the change
-		 * @see add_marker_view
-		 */
-		MarkerView* remove_named_marker_view(std::string item_id, void* src) ;
-
-		/**
-		 * Removes mv from the list of MarkerView upon this TimeAxis
-		 *
-		 * @param mv the MarkerView to remove
-		 * @param src the identity of the object that initiated the change
-		 */
-		void remove_marker_view(MarkerView* item, void* src) ;
-
-		//---------------------------------------------------------------------------------------//
-		// Selected item methods
-
-		/**
-		 * Sets the currently selected item upon this time axis
-		 *
-		 * @param mv the item to set selected
-		 */
-		void set_selected_time_axis_item(MarkerView* mv) ;
-
-		/**
-		 * Clears any selected item upon this time axis
-		 *
-		 */
-		void clear_selected_time_axis_item() ;
-
-		/**
-		 * Returnsthe currently selected item upon this time axis
-		 *
-		 * @return the currently selected item pon this time axis
-		 */
-		MarkerView* get_selected_time_axis_item() ;
-
-
-		/**
-		 * Sets the duration of the selected MarkerView to the specified number of seconds
-		 *
-		 * @param sec the duration to set the MArkerView to, in seconds
-		 */
-		void set_marker_duration_sec(double sec) ;
-
-		//---------------------------------------------------------------------------------//
-		// Emitted Signals
-
-		/** Emitted when a MarkerView is Added */
-		sigc::signal<void,MarkerView*,void*> MarkerViewAdded ;
-
-		/** Emitted when a MarkerView Item is removed */
-		sigc::signal<void,std::string,void*> MarkerViewRemoved ;
-
-	private:
-		/**
-		 * convenience method to re-get the samples per unit and tell items upon this view
-		 *
-		 */
-		void reset_samples_per_unit() ;
-
-		/** The list of items held by this time axis view helper */
-		typedef std::list<MarkerView *> MarkerViewList ;
-		MarkerViewList marker_view_list;
-
-		/** the currently selected time axis item upon this time axis */
-		MarkerView* selected_time_axis_item ;
-
-		/* the TimeAxisView that this object is acting as the view helper for */
-		MarkerTimeAxis& _trackview ;
-
-		ArdourCanvas::Group *canvas_group ;
-		ArdourCanvas::SimpleRect *canvas_rect ; /* frame around the whole thing */
-
-		/** the current samples per unit */
-		double _samples_per_unit;
-
-		/* XXX why are these different? */
-		Gdk::Color region_color;
-		uint32_t stream_base_color;
-
-}; /* class MarkerTimeAxisView */
-
-#endif /* __ardour_marker_time_axis_view_h__ */
diff --git a/gtk2_ardour/marker_view.cc b/gtk2_ardour/marker_view.cc
deleted file mode 100644
index 4bd8423..0000000
--- a/gtk2_ardour/marker_view.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
-    Copyright (C) 2003 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.h>
-
-#include "imageframe_time_axis.h"
-#include "imageframe_view.h"
-#include "canvas-simplerect.h"
-#include "public_editor.h"
-#include "marker_view.h"
-
-using namespace ARDOUR ;
-
-PBD::Signal1<void,MarkerView*> MarkerView::CatchDeletion
-
-//---------------------------------------------------------------------------------------//
-// Constructor / Desctructor
-
-/**
- * Constructs a new MarkerView
- *
- * @param parent the parent canvas item
- * @param tv the parent TimeAxisView of this item
- * @param tavi the TimeAxisViewItem that this item is to be assciated (marking) with
- * @param spu the current samples per unit
- * @param base_color
- * @param mark_type the marker type/name text, eg fade out, pan up etc.
- * @param mark_id unique name/id of this item
- * @param start the start time of this item
- * @param duration the duration of this item
- */
-MarkerView::MarkerView(ArdourCanvas::Group *parent,
-		       TimeAxisView* tv,
-		       ImageFrameView* marked,
-		       double spu,
-		       Gdk::Color& basic_color,
-		       std::string mark_type,
-		       std::string mark_id,
-		       framepos_t start,
-		       framecnt_t duration)
-  : TimeAxisViewItem(mark_id, *parent,*tv,spu,basic_color,start,duration)
-{
-	mark_type_text = mark_type ;
-	marked_item = marked ;
-
-	// set the canvas item text to the marker type, not the id
-	set_name_text(mark_type_text) ;
-
-	// hook up our canvas events
-
-	if (frame_handle_start) {
-		frame_handle_start->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_markerview_start_handle_event), frame_handle_start, this));
-		frame_handle_end->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_markerview_end_handle_event), frame_handle_end, this));
-	}
-	group->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_markerview_item_view_event), group, this));
-
-	set_position(start, this) ;
-	set_duration(duration, this) ;
-}
-
-/**
- * Destructor
- * Destroys this Marker Item and removes the association between itself and the item it is marking.
- */
-MarkerView::~MarkerView()
-{
-	// remove the association our marked may still have to us
-	if(marked_item)
-	{
-		marked_item->remove_marker_view_item(this, this) ;
-	}
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Marker Type Methods
-
-/**
- * Sets the marker Type text of this this MarkerItem, eg fade_out, pan up etc.
- *
- * @param type_text the marker type text of this item
- */
-void
-MarkerView::set_mark_type_text(std::string type_text)
-{
-	mark_type_text = type_text ;
-	 MarkTypeChanged(mark_type_text, this) ; /* EMIT_SIGNAL */
-}
-
-/**
- * Returns the marker Type of this this MarkerItem, eg fade_out, pan up etc.
- *
- * @return the marker type text of this item
- */
-std::string
-MarkerView::get_mark_type_text() const
-{
-	return(mark_type_text) ;
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Marked Item Methods
-
-ImageFrameView*
-MarkerView::set_marked_item(ImageFrameView* item)
-{
-	ImageFrameView* temp = marked_item ;
-	marked_item = item ;
-
-	 MarkedItemChanged(marked_item, this) ; /* EMIT_SIGNAL */
-	return(temp) ;
-}
-
-ImageFrameView*
-MarkerView::get_marked_item()
-{
-	return(marked_item) ;
-}
diff --git a/gtk2_ardour/marker_view.h b/gtk2_ardour/marker_view.h
deleted file mode 100644
index 38088b0..0000000
--- a/gtk2_ardour/marker_view.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
-    Copyright (C) 2003 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 __gtk_ardour_marker_view_h__
-#define __gtk_ardour_marker_view_h__
-
-#include <string>
-#include "time_axis_view_item.h"
-
-#include "canvas.h"
-
-namespace Gdk {
-	class Color;
-}
-
-class MarkerTimeAxisView ;
-class ImageFrameView ;
-
-/**
- * MarkerView defines a marker item that may be placed upon a MarkerTimeAxis.
- *
- * The aim of the MarkerView is to provide additional timing details for visual based time axis.
- * The MarkerView item is associated with one other TimeAxisViewItem and has a start and a duration.
- */
-class MarkerView : public TimeAxisViewItem
-{
-	public:
-		//---------------------------------------------------------------------------------------//
-		// Constructor / Desctructor
-
-		/**
-		 * Constructs a new MarkerView
-		 *
-		 * @param parent the parent canvas item
-		 * @param tv the parent TimeAxisView of this item
-		 * @param marked the Item that this item is to be assciated (marking) with
-		 * @param spu the current samples per unit
-		 * @param base_color
-		 * @param mark_type the marker type/name text, eg fade out, pan up etc.
-		 * @param mark_id unique name/id of this item
-		 * @param start the start time of this item
-		 * @param duration the duration of this item
-		 */
-                 MarkerView(ArdourCanvas::Group *parent,
-			TimeAxisView *tv,
-			ImageFrameView* marked,
-			double spu,
-		        Gdk::Color& base_color,
-			std::string mark_type,
-			std::string mark_id,
-			nframes_t start,
-			nframes_t duration) ;
-
-		/**
-		 * Destructor
-		 * Destroys this Marker Item and removes the association between itself and the item it is marking.
-		 */
-		~MarkerView() ;
-
-		static PBD::Signal1<void,MarkerView*> CatchDeletion;
-
-		//---------------------------------------------------------------------------------------//
-		// Marker Type Methods
-
-		/**
-		 * Sets the marker Type text of this this MarkerItem, eg fade_out, pan up etc.
-		 *
-		 * @param type_text the marker type text of this item
-		 */
-		void set_mark_type_text(std::string type_text) ;
-
-		/**
-		 * Returns the marker Type of this this MarkerItem, eg fade_out, pan up etc.
-		 *
-		 * @return the marker type text of this item
-		 */
-		std::string get_mark_type_text() const ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Marked Item Methods
-
-		/**
-		 * Returns the time axis item being marked by this item
-		 *
-		 * @return the time axis item being marked by this item
-		 */
-		ImageFrameView* get_marked_item() ;
-
-		/**
-		 * Sets the time axis item being marker by this item
-		 *
-		 * @param item the time axis item to be marked by this item
-		 * @return the previously marked item, or 0 if no previous marked item exists
-		 */
-		ImageFrameView* set_marked_item(ImageFrameView* item) ;
-
-		//---------------------------------------------------------------------------------//
-		// Emitted Signals
-
-		/** Emitted when the mark type text is changed */
-		sigc::signal<void,std::string,void*> MarkTypeChanged ;
-
-		/** Emitted when the Marked Item is changed */
-		sigc::signal<void,ImageFrameView*,void*> MarkedItemChanged ;
-
-
-	protected:
-
-	private:
-		/** the unique name/id of this item */
-		std::string mark_type_text ;
-
-		/* a pointer to the time axis item this marker is assoiated(marking up) with */
-		ImageFrameView* marked_item ;
-
-} ; /* class MarkerView */
-
-
-#endif /* __gtk_ardour_imageframe_view_h__ */
diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc
new file mode 100644
index 0000000..f392dc0
--- /dev/null
+++ b/gtk2_ardour/meter_patterns.cc
@@ -0,0 +1,1063 @@
+/*
+    Copyright (C) 2013 Paul Davis
+    Author: 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <gtkmm2ext/cairo_widget.h>
+#include <gtkmm2ext/gtk_ui.h>
+#include <gtkmm2ext/utils.h>
+#include <gtkmm2ext/rgb_macros.h>
+
+#include <ardour/rc_configuration.h>
+#include "ardour_ui.h"
+#include "utils.h"
+#include "logmeter.h"
+#include "meter_patterns.h"
+
+#include "i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using namespace Gtk;
+using namespace Gtkmm2ext;
+using namespace std;
+using namespace ArdourMeter;
+
+static const int max_pattern_metric_size = 1026;
+
+/* signals used by meters */
+
+sigc::signal<void> ArdourMeter::ResetAllPeakDisplays;
+sigc::signal<void,ARDOUR::Route*> ArdourMeter::ResetRoutePeakDisplays;
+sigc::signal<void,ARDOUR::RouteGroup*> ArdourMeter::ResetGroupPeakDisplays;
+sigc::signal<void> ArdourMeter::RedrawMetrics;
+
+sigc::signal<void, int, ARDOUR::RouteGroup*, ARDOUR::MeterType> ArdourMeter::SetMeterTypeMulti;
+
+
+/* pattern cache */
+
+struct MeterMatricsMapKey {
+	MeterMatricsMapKey (std::string n, MeterType t, int dt)
+		: _n(n)
+		, _t(t)
+		, _dt(dt)
+	{}
+	inline bool operator<(const MeterMatricsMapKey& rhs) const {
+		return (_n < rhs._n) || (_n == rhs._n && _t < rhs._t) || (_n == rhs._n && _t == rhs._t && _dt < rhs._dt);
+	}
+	std::string _n;
+	MeterType _t;
+	int _dt;
+};
+
+namespace ArdourMeter {
+	typedef std::map<MeterMatricsMapKey, cairo_pattern_t*> MetricPatternMap;
+}
+
+static ArdourMeter::MetricPatternMap ticks_patterns;
+static ArdourMeter::MetricPatternMap metric_patterns;
+
+
+const std::string
+ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
+{
+	switch (mt) {
+		case MeterPeak:
+			return _("Peak");
+			break;
+		case MeterKrms:
+			return _("RMS + Peak");
+			break;
+		case MeterIEC1DIN:
+			return _("IEC1/DIN");
+			break;
+		case MeterIEC1NOR:
+			return _("IEC1/Nordic");
+			break;
+		case MeterIEC2BBC:
+			return _("IEC2/BBC");
+			break;
+		case MeterIEC2EBU:
+			return _("IEC2/EBU");
+			break;
+		case MeterK20:
+			return _("K20");
+			break;
+		case MeterK14:
+			return _("K14");
+			break;
+		case MeterVU:
+			return _("VU");
+			break;
+		default:
+			return _("???");
+			break;
+	}
+}
+
+static inline int types_to_bit (vector<ARDOUR::DataType> types) {
+	int rv = 0;
+	for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
+		rv |= 1 << (*i);
+	}
+	return rv;
+}
+
+static inline float mtr_col_and_fract(
+		cairo_t* cr, Gdk::Color const * const c, const uint32_t peakcolor, const MeterType mt, const float val)
+{
+	float fraction = 0;
+
+	switch (mt) {
+		default:
+		case MeterKrms:
+		case MeterPeak:
+			fraction = log_meter (val);
+			if (val >= 0 || val == -9) {
+				cairo_set_source_rgb (cr,
+						UINT_RGBA_R_FLT(peakcolor),
+						UINT_RGBA_G_FLT(peakcolor),
+						UINT_RGBA_B_FLT(peakcolor));
+			} else {
+				cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
+			}
+			break;
+		case MeterIEC2BBC:
+		case MeterIEC2EBU:
+			fraction = meter_deflect_ppm(val);
+			cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
+			break;
+		case MeterIEC1NOR:
+			fraction = meter_deflect_nordic(val);
+#if 0
+			if (val == -18.0) {
+				cairo_set_source_rgb (cr,
+						UINT_RGBA_R_FLT(peakcolor),
+						UINT_RGBA_G_FLT(peakcolor),
+						UINT_RGBA_B_FLT(peakcolor));
+			} else {
+				cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
+			}
+#else
+			cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
+#endif
+			break;
+		case MeterIEC1DIN:
+			fraction = meter_deflect_din(val);
+			if (val == -9.0 || val == -15 || val == -18) {
+				cairo_set_source_rgb (cr,
+						UINT_RGBA_R_FLT(peakcolor),
+						UINT_RGBA_G_FLT(peakcolor),
+						UINT_RGBA_B_FLT(peakcolor));
+			} else {
+				cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
+			}
+			break;
+		case MeterVU:
+			fraction = meter_deflect_vu(val);
+			if (val >= -20.0) {
+				cairo_set_source_rgb (cr,
+						UINT_RGBA_R_FLT(peakcolor),
+						UINT_RGBA_G_FLT(peakcolor),
+						UINT_RGBA_B_FLT(peakcolor));
+			} else {
+				cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
+			}
+			break;
+		case MeterK20:
+			fraction = meter_deflect_k (val, 20);
+			if (val >= -16.0) {
+				cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red
+			} else if (val >= -20.0) {
+				cairo_set_source_rgb (cr, 0.8, 0.8, 0.0); // yellow
+			} else {
+				cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); // green
+			}
+			break;
+		case MeterK14:
+			if (val >= -10.0) {
+				cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red
+			} else if (val >= -14.0) {
+				cairo_set_source_rgb (cr, 0.8, 0.8, 0.0); // yellow
+			} else {
+				cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); // green
+			}
+			fraction = meter_deflect_k (val, 14);
+			break;
+	}
+	return fraction;
+}
+
+static void mtr_red_stripe(cairo_t* cr, float l, float w, int h, float top, float bot) {
+	if (w <= 0) return;
+	int t = h - floorf (h * (top));
+	int b = h - floorf (h * (bot));
+	cairo_set_source_rgba (cr, .75, 0, 0, 0.75);
+	cairo_rectangle (cr, l, t + .5, w, b - t);
+	cairo_fill (cr);
+}
+
+static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) {
+	float r,g,b;
+	switch(type) {
+		case MeterVU:
+			if (rgba_p_from_style("meterstripVU", &r, &g, &b, "bg")) {
+				cairo_set_source_rgb (cr, r, g, b);
+			} else {
+				cairo_set_source_rgb (cr, 1.0, 1.0, 0.85);
+			}
+			break;
+		case MeterIEC1DIN:
+		case MeterIEC1NOR:
+		case MeterIEC2BBC:
+		case MeterIEC2EBU:
+		case MeterK14:
+		case MeterK20:
+			if (rgba_p_from_style("meterstripPPM", &r, &g, &b, "bg")) {
+				cairo_set_source_rgb (cr, r, g, b);
+			} else {
+				cairo_set_source_rgb (cr, 0.1, 0.1, 0.1);
+			}
+			break;
+		default:
+			{
+			Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_ACTIVE);
+			cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
+			}
+			break;
+	}
+}
+
+static void set_fg_color(Gtk::Widget&, MeterType type, Gdk::Color * c) {
+	float r,g,b;
+	switch(type) {
+		case MeterVU:
+			if (rgba_p_from_style("meterstripVU", &r, &g, &b)) {
+				c->set_rgb_p(r, g, b);
+			} else {
+				c->set_rgb_p(0.0, 0.0, 0.0);
+			}
+			break;
+		default:
+			if (rgba_p_from_style("meterstripPPM", &r, &g, &b)) {
+				c->set_rgb_p(r, g, b);
+			} else {
+				c->set_rgb_p(1.0, 1.0, 1.0);
+			}
+			break;
+	}
+}
+
+static cairo_pattern_t*
+meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> types)
+{
+	Glib::RefPtr<Gdk::Window> win (w.get_window());
+
+	bool background;
+	bool tickleft, tickright;
+	gint width, height;
+	win->get_size (width, height);
+	tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left";
+	tickright = w.get_name().substr(w.get_name().length() - 5) == "Right";
+	background = types.size() == 0 || tickleft || tickright;
+
+	float box_l=0;
+	float box_w=0;
+	if (tickleft) {
+		if (w.get_name().substr(0, 3) == "Bar") {
+			box_l = width-2; box_w = 2;
+		} else if (w.get_name().substr(0, 4) == "Mark") {
+			box_l = width-2; box_w = 2;
+			background = false;
+		}
+	} else if (tickright) {
+		if (w.get_name().substr(0, 3) == "Bar") {
+			box_l = 0; box_w = 2;
+		} else if (w.get_name().substr(0, 4) == "Mark") {
+			box_l = 0; box_w = 2;
+			background = false;
+		}
+	} else {
+		box_l = 0; box_w = 3;
+	}
+
+	cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
+	cairo_t* cr = cairo_create (surface);
+
+	cairo_move_to (cr, 0, 0);
+	cairo_rectangle (cr, 0, 0, width, height);
+
+	if (background) {
+		/* meterbridge */
+		set_bg_color(w, cr, type);
+	} else {
+		/* mixer */
+		Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL);
+		cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
+	}
+	cairo_fill (cr);
+
+	height = min(max_pattern_metric_size, height);
+	uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel");
+
+	for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
+
+		Gdk::Color c;
+		if (types.size() > 1 && (*i) == DataType::MIDI) {
+			/* we're overlaying more than 1 set of marks, so use different colours */
+			c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
+		} else if (background) {
+			set_fg_color(w, type, &c);
+		} else {
+			c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
+		}
+
+		// tick-maker position in dBFS, line-thickness
+		std::map<float,float> points;
+
+		switch (*i) {
+		case DataType::AUDIO:
+
+			switch (type) {
+				case MeterK14:
+					points.insert (std::pair<float,float>(-54.0f, 1.0));
+					points.insert (std::pair<float,float>(-44.0f, 1.0));
+					points.insert (std::pair<float,float>(-34.0f, 1.0));
+					points.insert (std::pair<float,float>(-24.0f, 1.0));
+					points.insert (std::pair<float,float>(-20.0f, 1.0));
+					points.insert (std::pair<float,float>(-17.0f, 1.0));
+					points.insert (std::pair<float,float>(-14.0f, 1.0)); //   0
+					points.insert (std::pair<float,float>(-11.0f, 1.0)); //  +3
+					points.insert (std::pair<float,float>(-10.0f, 0.8)); //  +4
+					points.insert (std::pair<float,float>( -8.0f, 1.0)); //  +6
+					points.insert (std::pair<float,float>( -4.0f, 1.0)); // +10
+					points.insert (std::pair<float,float>(  0.0f, 1.0));
+					break;
+				case MeterK20:
+					points.insert (std::pair<float,float>(-60.0f, 1.0));
+					points.insert (std::pair<float,float>(-50.0f, 1.0));
+					points.insert (std::pair<float,float>(-40.0f, 1.0));
+					points.insert (std::pair<float,float>(-30.0f, 1.0));
+					points.insert (std::pair<float,float>(-26.0f, 1.0));
+					points.insert (std::pair<float,float>(-23.0f, 1.0));
+					points.insert (std::pair<float,float>(-20.0f, 1.0)); //  0
+					points.insert (std::pair<float,float>(-17.0f, 1.0));
+					points.insert (std::pair<float,float>(-16.0f, 0.8));
+					points.insert (std::pair<float,float>(-14.0f, 1.0)); // +6
+					points.insert (std::pair<float,float>(-10.0f, 1.0));
+					points.insert (std::pair<float,float>( -5.0f, 1.0));
+					points.insert (std::pair<float,float>(  0.0f, 1.0)); //+20
+					break;
+				case MeterIEC2EBU:
+					points.insert (std::pair<float,float>(-30.0f, 1.0));
+					points.insert (std::pair<float,float>(-28.0f, 0.5));
+					points.insert (std::pair<float,float>(-26.0f, 1.0));
+					points.insert (std::pair<float,float>(-24.0f, 0.5));
+					points.insert (std::pair<float,float>(-22.0f, 1.0));
+					points.insert (std::pair<float,float>(-20.0f, 0.5));
+					points.insert (std::pair<float,float>(-18.0f, 1.0));
+					points.insert (std::pair<float,float>(-16.0f, 0.5));
+					points.insert (std::pair<float,float>(-14.0f, 1.0));
+					points.insert (std::pair<float,float>(-12.0f, 0.5));
+					points.insert (std::pair<float,float>(-10.0f, 1.0));
+					points.insert (std::pair<float,float>( -9.0f, 0.8));
+					points.insert (std::pair<float,float>( -8.0f, 0.5));
+					points.insert (std::pair<float,float>( -6.0f, 1.0));
+					break;
+				case MeterIEC2BBC:
+					points.insert (std::pair<float,float>(-30.0f, 1.0));
+					points.insert (std::pair<float,float>(-26.0f, 1.0));
+					points.insert (std::pair<float,float>(-22.0f, 1.0));
+					points.insert (std::pair<float,float>(-18.0f, 1.0));
+					points.insert (std::pair<float,float>(-14.0f, 1.0));
+					points.insert (std::pair<float,float>(-10.0f, 1.0));
+					points.insert (std::pair<float,float>( -6.0f, 1.0));
+					break;
+				case MeterIEC1NOR:
+					points.insert (std::pair<float,float>(-60.0f, 1.0)); // -42
+					points.insert (std::pair<float,float>(-57.0f, 0.5));
+					points.insert (std::pair<float,float>(-54.0f, 1.0));
+					points.insert (std::pair<float,float>(-51.0f, 0.5));
+					points.insert (std::pair<float,float>(-48.0f, 1.0));
+					points.insert (std::pair<float,float>(-45.0f, 0.5));
+					points.insert (std::pair<float,float>(-42.0f, 1.0));
+					points.insert (std::pair<float,float>(-39.0f, 0.5));
+					points.insert (std::pair<float,float>(-36.0f, 1.0));
+
+					points.insert (std::pair<float,float>(-33.0f, 0.5));
+					points.insert (std::pair<float,float>(-30.0f, 1.0));
+					points.insert (std::pair<float,float>(-27.0f, 0.5));
+					points.insert (std::pair<float,float>(-24.0f, 1.0));
+					points.insert (std::pair<float,float>(-21.0f, 0.5));
+
+					points.insert (std::pair<float,float>(-18.0f, 1.0));
+					points.insert (std::pair<float,float>(-15.0f, 0.5));
+					points.insert (std::pair<float,float>(-12.0f, 1.0));
+					points.insert (std::pair<float,float>( -9.0f, 1.0));
+					points.insert (std::pair<float,float>( -6.0f, 0.5));
+					mtr_red_stripe(cr, box_l, box_w, height,
+							meter_deflect_nordic(-6.0f), meter_deflect_nordic(-12.0f));
+					break;
+				case MeterIEC1DIN:
+					points.insert (std::pair<float,float>( -3.0f, 0.5)); // "200%"
+					points.insert (std::pair<float,float>( -4.0f, 1.0));
+					points.insert (std::pair<float,float>( -5.0f, 0.5));
+					points.insert (std::pair<float,float>( -6.0f, 0.5));
+					points.insert (std::pair<float,float>( -7.0f, 0.5));
+					points.insert (std::pair<float,float>( -8.0f, 0.5));
+					points.insert (std::pair<float,float>( -9.0f, 1.0)); // "100%"
+					points.insert (std::pair<float,float>(-10.0f, 0.5));
+					points.insert (std::pair<float,float>(-11.0f, 0.5));
+					points.insert (std::pair<float,float>(-12.0f, 0.5));
+					points.insert (std::pair<float,float>(-13.0f, 0.5));
+					points.insert (std::pair<float,float>(-14.0f, 1.0));
+					points.insert (std::pair<float,float>(-15.0f, 0.8)); // "50%"
+					points.insert (std::pair<float,float>(-18.0f, 0.8)); // "-9"
+					points.insert (std::pair<float,float>(-19.0f, 1.0));
+					points.insert (std::pair<float,float>(-24.0f, 0.5));
+					points.insert (std::pair<float,float>(-29.0f, 1.0)); // "-20", "10%"
+					points.insert (std::pair<float,float>(-34.0f, 0.5)); // -25
+					//points.insert (std::pair<float,float>(-35.0f, 0.5)); // "5%" " -20"
+					points.insert (std::pair<float,float>(-39.0f, 1.0));
+					points.insert (std::pair<float,float>(-49.0f, 1.0));
+					points.insert (std::pair<float,float>(-54.0f, 0.5));
+					points.insert (std::pair<float,float>(-59.0f, 1.0));
+					mtr_red_stripe(cr, box_l, box_w, height,
+							meter_deflect_din(0.0f), meter_deflect_din(-9.0f));
+					break;
+				case MeterVU:
+					points.insert (std::pair<float,float>(-17.0f, 1.0)); //+3 VU
+					points.insert (std::pair<float,float>(-18.0f, 1.0));
+					points.insert (std::pair<float,float>(-19.0f, 1.0));
+					points.insert (std::pair<float,float>(-19.5f, 0.5));
+					points.insert (std::pair<float,float>(-20.0f, 1.0)); // 0 VU
+					points.insert (std::pair<float,float>(-20.5f, 0.5));
+					points.insert (std::pair<float,float>(-21.0f, 1.0));
+					points.insert (std::pair<float,float>(-22.0f, 1.0));
+					points.insert (std::pair<float,float>(-23.0f, 1.0)); //-3 VU
+					points.insert (std::pair<float,float>(-24.0f, 0.5));
+					points.insert (std::pair<float,float>(-25.0f, 1.0));
+					points.insert (std::pair<float,float>(-26.0f, 0.5));
+					points.insert (std::pair<float,float>(-27.0f, 1.0)); //-7 VU
+					points.insert (std::pair<float,float>(-30.0f, 1.0));
+					points.insert (std::pair<float,float>(-35.0f, 0.5));
+					points.insert (std::pair<float,float>(-40.0f, 1.0));
+					mtr_red_stripe(cr, box_l, box_w, height,
+							meter_deflect_vu(-17.0f), meter_deflect_vu(-20.0f));
+					break;
+
+				default:
+					points.insert (std::pair<float,float>(-60, 0.5));
+					points.insert (std::pair<float,float>(-50, 1.0));
+					points.insert (std::pair<float,float>(-40, 1.0));
+					points.insert (std::pair<float,float>(-30, 1.0));
+					if (Config->get_meter_line_up_level() == MeteringLineUp24) {
+						points.insert (std::pair<float,float>(-24, 1.0));
+					} else {
+						points.insert (std::pair<float,float>(-25, 1.0));
+					}
+					points.insert (std::pair<float,float>(-20, 1.0));
+
+					points.insert (std::pair<float,float>(-19, 0.5));
+					points.insert (std::pair<float,float>(-18, 1.0));
+					points.insert (std::pair<float,float>(-17, 0.5));
+					points.insert (std::pair<float,float>(-16, 0.5));
+					points.insert (std::pair<float,float>(-15, 1.0));
+
+					points.insert (std::pair<float,float>(-14, 0.5));
+					points.insert (std::pair<float,float>(-13, 0.5));
+					points.insert (std::pair<float,float>(-12, 0.5));
+					points.insert (std::pair<float,float>(-11, 0.5));
+					points.insert (std::pair<float,float>(-10, 1.0));
+
+					points.insert (std::pair<float,float>( -9, 1.0));
+					points.insert (std::pair<float,float>( -8, 0.5));
+					points.insert (std::pair<float,float>( -7, 0.5));
+					points.insert (std::pair<float,float>( -6, 0.5));
+					points.insert (std::pair<float,float>( -5, 1.0));
+					points.insert (std::pair<float,float>( -4, 0.5));
+					points.insert (std::pair<float,float>( -3, 1.0));
+					points.insert (std::pair<float,float>( -2, 0.5));
+					points.insert (std::pair<float,float>( -1, 0.5));
+
+					points.insert (std::pair<float,float>(  0, 1.0));
+					points.insert (std::pair<float,float>(  1, 0.5));
+					points.insert (std::pair<float,float>(  2, 0.5));
+					points.insert (std::pair<float,float>(  3, 1.0));
+					points.insert (std::pair<float,float>(  4, 0.5));
+					points.insert (std::pair<float,float>(  5, 0.5));
+					break;
+			}
+			break;
+
+		case DataType::MIDI:
+			points.insert (std::pair<float,float>(  0, 1.0));
+			points.insert (std::pair<float,float>( 16, 0.5));
+			points.insert (std::pair<float,float>( 32, 0.5));
+			points.insert (std::pair<float,float>( 48, 0.5));
+			points.insert (std::pair<float,float>( 64, 1.0));
+			points.insert (std::pair<float,float>( 80, 0.5));
+			points.insert (std::pair<float,float>( 96, 0.5));
+			points.insert (std::pair<float,float>(100, 1.0));
+			points.insert (std::pair<float,float>(112, 0.5));
+			points.insert (std::pair<float,float>(127, 1.0));
+			break;
+		}
+
+		for (std::map<float,float>::const_iterator j = points.begin(); j != points.end(); ++j) {
+			cairo_set_line_width (cr, (j->second));
+
+			float fraction = 0;
+			gint pos;
+
+			switch (*i) {
+			case DataType::AUDIO:
+				fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first);
+
+				pos = height - (gint) floor (height * fraction);
+				pos = max (pos, 1);
+				cairo_move_to(cr, 0, pos + .5);
+				cairo_line_to(cr, 3, pos + .5);
+				cairo_stroke (cr);
+				break;
+			case DataType::MIDI:
+				fraction = (j->first) / 127.0;
+				pos = 1 + height - (gint) floor (height * fraction);
+				pos = min (pos, height);
+				cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
+				cairo_arc(cr, 1.5, pos + .5, 1.0, 0, 2 * M_PI);
+				cairo_fill(cr);
+				break;
+			}
+		}
+	}
+
+	cairo_pattern_t* pattern = cairo_pattern_create_for_surface (surface);
+
+	cairo_destroy (cr);
+	cairo_surface_destroy (surface);
+
+	return pattern;
+}
+
+static cairo_pattern_t*
+meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
+{
+	Glib::RefPtr<Gdk::Window> win (w.get_window());
+
+	bool tickleft, tickright;
+	bool background;
+	int overlay_midi = 1;
+	gint width, height;
+	win->get_size (width, height);
+
+	tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left";
+	tickright = w.get_name().substr(w.get_name().length() - 5) == "Right";
+	background = types.size() == 0 || tickleft || tickright;
+
+	if (!tickleft && !tickright) {
+		tickright = true;
+	}
+
+	cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
+	cairo_t* cr = cairo_create (surface);
+	Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(w.get_pango_context());
+
+	Pango::AttrList audio_font_attributes;
+	Pango::AttrList midi_font_attributes;
+	Pango::AttrList unit_font_attributes;
+
+	Pango::AttrFontDesc* font_attr;
+	Pango::FontDescription font;
+
+	font = Pango::FontDescription ("ArdourMono");
+	double fixfontsize = 81920.0 / (double) ARDOUR::Config->get_font_scale();
+
+	font.set_weight (Pango::WEIGHT_NORMAL);
+	font.set_size (9.0 * PANGO_SCALE * fixfontsize);
+	font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
+	audio_font_attributes.change (*font_attr);
+	delete font_attr;
+
+	font.set_weight (Pango::WEIGHT_ULTRALIGHT);
+	font.set_stretch (Pango::STRETCH_ULTRA_CONDENSED);
+	font.set_size (8.0 * PANGO_SCALE * fixfontsize);
+	font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
+	midi_font_attributes.change (*font_attr);
+	delete font_attr;
+
+	font.set_size (6.0 * PANGO_SCALE * fixfontsize);
+	font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
+	unit_font_attributes.change (*font_attr);
+	delete font_attr;
+
+	cairo_move_to (cr, 0, 0);
+	cairo_rectangle (cr, 0, 0, width, height);
+	if (background) {
+		/* meterbridge */
+		set_bg_color(w, cr, type);
+	} else {
+		/* mixer */
+		Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL);
+		cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
+	}
+	cairo_fill (cr);
+
+	cairo_set_line_width (cr, 1.0);
+
+	height = min(max_pattern_metric_size, height);
+	uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel");
+	Gdk::Color c; // default text color
+
+	for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
+
+		if (types.size() > 1 && (*i) == DataType::MIDI && overlay_midi == 0) {
+			continue;
+		}
+
+		if (types.size() > 1 && (*i) == DataType::MIDI) {
+			/* we're overlaying more than 1 set of marks, so use different colours */
+			c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
+		} else if (background) {
+			set_fg_color(w, type, &c);
+		} else {
+			c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
+		}
+
+		std::map<float,string> points; // map: label-pos in dBFS, label-text
+
+		switch (*i) {
+		case DataType::AUDIO:
+			layout->set_attributes (audio_font_attributes);
+			switch (type) {
+				case MeterK14:
+					overlay_midi = 0;
+					points.insert (std::pair<float,string>(-54.0f, "-40"));
+					points.insert (std::pair<float,string>(-44.0f, "-30"));
+					points.insert (std::pair<float,string>(-34.0f, "-20"));
+					points.insert (std::pair<float,string>(-24.0f, "-10"));
+					points.insert (std::pair<float,string>(-20.0f,  "-6"));
+					points.insert (std::pair<float,string>(-17.0f,  "-3"));
+					points.insert (std::pair<float,string>(-14.0f,  " 0"));
+					points.insert (std::pair<float,string>(-11.0f,  "+3"));
+					points.insert (std::pair<float,string>( -8.0f,  "+6"));
+					points.insert (std::pair<float,string>( -4.0f, "+10"));
+					points.insert (std::pair<float,string>(  0.0f, "+14"));
+					break;
+				case MeterK20:
+					overlay_midi = 0;
+					points.insert (std::pair<float,string>(-60.0f, "-40"));
+					points.insert (std::pair<float,string>(-50.0f, "-30"));
+					points.insert (std::pair<float,string>(-40.0f, "-20"));
+					points.insert (std::pair<float,string>(-30.0f, "-10"));
+					points.insert (std::pair<float,string>(-26.0f,  "-6"));
+					points.insert (std::pair<float,string>(-23.0f,  "-3"));
+					points.insert (std::pair<float,string>(-20.0f,  " 0"));
+					points.insert (std::pair<float,string>(-17.0f,  "+3"));
+					points.insert (std::pair<float,string>(-14.0f,  "+6"));
+					points.insert (std::pair<float,string>(-10.0f, "+10"));
+					points.insert (std::pair<float,string>( -5.0f, "+15"));
+					points.insert (std::pair<float,string>(  0.0f, "+20"));
+					break;
+				default:
+				case MeterPeak:
+				case MeterKrms:
+					points.insert (std::pair<float,string>(-50.0f, "-50"));
+					points.insert (std::pair<float,string>(-40.0f, "-40"));
+					points.insert (std::pair<float,string>(-30.0f, "-30"));
+					points.insert (std::pair<float,string>(-20.0f, "-20"));
+					if (types.size() == 1) {
+						if (Config->get_meter_line_up_level() == MeteringLineUp24) {
+							points.insert (std::pair<float,string>(-24.0f, "-24"));
+						} else {
+							points.insert (std::pair<float,string>(-25.0f, "-25"));
+						}
+						points.insert (std::pair<float,string>(-15.0f, "-15"));
+					}
+					points.insert (std::pair<float,string>(-18.0f, "-18"));
+					points.insert (std::pair<float,string>(-10.0f, "-10"));
+					points.insert (std::pair<float,string>( -5.0f, "-5"));
+					points.insert (std::pair<float,string>( -3.0f, "-3"));
+					points.insert (std::pair<float,string>(  0.0f, "+0"));
+					points.insert (std::pair<float,string>(  3.0f, "+3"));
+					break;
+
+				case MeterIEC2EBU:
+					overlay_midi = 3;
+					points.insert (std::pair<float,string>(-30.0f, "-12"));
+					points.insert (std::pair<float,string>(-26.0f, "-8"));
+					points.insert (std::pair<float,string>(-22.0f, "-4"));
+					points.insert (std::pair<float,string>(-18.0f, "TST"));
+					points.insert (std::pair<float,string>(-14.0f, "+4"));
+					points.insert (std::pair<float,string>(-10.0f, "+8"));
+					points.insert (std::pair<float,string>( -6.0f, "+12"));
+					break;
+
+				case MeterIEC2BBC:
+					overlay_midi = 3;
+					points.insert (std::pair<float,string>(-30.0f, " 1 "));
+					points.insert (std::pair<float,string>(-26.0f, " 2 "));
+					points.insert (std::pair<float,string>(-22.0f, " 3 "));
+					points.insert (std::pair<float,string>(-18.0f, " 4 "));
+					points.insert (std::pair<float,string>(-14.0f, " 5 "));
+					points.insert (std::pair<float,string>(-10.0f, " 6 "));
+					points.insert (std::pair<float,string>( -6.0f, " 7 "));
+					break;
+
+				case MeterIEC1NOR:
+					overlay_midi = 0;
+					//points.insert (std::pair<float,string>(-60.0f, "-42"));
+					points.insert (std::pair<float,string>(-54.0f, "-36"));
+					points.insert (std::pair<float,string>(-48.0f, "-30"));
+					points.insert (std::pair<float,string>(-42.0f, "-24"));
+					points.insert (std::pair<float,string>(-36.0f, "-18"));
+
+					//points.insert (std::pair<float,string>(-33.0f, "-15"));
+					points.insert (std::pair<float,string>(-30.0f, "-12"));
+					//points.insert (std::pair<float,string>(-27.0f, "-9"));
+					points.insert (std::pair<float,string>(-24.0f, "-6"));
+					//points.insert (std::pair<float,string>(-21.0f, "-3"));
+
+					points.insert (std::pair<float,string>(-18.0f, "TST"));
+					//points.insert (std::pair<float,string>(-15.0f, "+3"));
+					points.insert (std::pair<float,string>(-12.0f, "+6"));
+					points.insert (std::pair<float,string>( -9.0f, "+9"));
+					//points.insert (std::pair<float,string>( -6.0f, "+12"));
+					break;
+
+				case MeterIEC1DIN:
+					overlay_midi = 2;
+					//points.insert (std::pair<float,string>( -3.0f, "200%"));
+					points.insert (std::pair<float,string>( -4.0f, "+5"));
+					points.insert (std::pair<float,string>( -9.0f, "0")); // "100%";
+					points.insert (std::pair<float,string>(-14.0f, "-5"));
+					//points.insert (std::pair<float,string>(-15.0f, "50%"));
+					//points.insert (std::pair<float,string>(-18.0f, "-9"));
+					points.insert (std::pair<float,string>(-19.0f, "-10")); // "30%"
+					points.insert (std::pair<float,string>(-29.0f, "-20")); // "10%"
+					//points.insert (std::pair<float,string>(-35.0f, "5%")); // "5%"
+					points.insert (std::pair<float,string>(-39.0f, "-30"));
+					//points.insert (std::pair<float,string>(-49.0f, "1%"));
+					points.insert (std::pair<float,string>(-59.0f, "-50"));
+					break;
+
+				case MeterVU:
+					overlay_midi = 0;
+					points.insert (std::pair<float,string>(-17.0f, "+3"));
+					points.insert (std::pair<float,string>(-18.0f, "+2"));
+					points.insert (std::pair<float,string>(-19.0f, "+1"));
+					points.insert (std::pair<float,string>(-20.0f, " 0"));
+					points.insert (std::pair<float,string>(-21.0f, "-1"));
+					points.insert (std::pair<float,string>(-22.0f, "-2"));
+					points.insert (std::pair<float,string>(-23.0f, "-3"));
+					points.insert (std::pair<float,string>(-25.0f, "-5"));
+					points.insert (std::pair<float,string>(-27.0f, "-7"));
+					points.insert (std::pair<float,string>(-30.0f, "-10"));
+					points.insert (std::pair<float,string>(-40.0f, "-20"));
+					break;
+			}
+			break;
+		case DataType::MIDI:
+			layout->set_attributes (midi_font_attributes);
+			if (types.size() == 1) {
+				points.insert (std::pair<float,string>(  0, "0"));
+				points.insert (std::pair<float,string>( 16,  "16"));
+				points.insert (std::pair<float,string>( 32,  "32"));
+				points.insert (std::pair<float,string>( 48,  "48"));
+				points.insert (std::pair<float,string>( 64,  "64"));
+				points.insert (std::pair<float,string>( 80,  "80"));
+				points.insert (std::pair<float,string>( 96,  "96"));
+				points.insert (std::pair<float,string>(100, "100"));
+				points.insert (std::pair<float,string>(112, "112"));
+			} else {
+				switch (overlay_midi) {
+					case 1:
+						/* labels that don't overlay with dBFS */
+						points.insert (std::pair<float,string>(  0, "0"));
+						points.insert (std::pair<float,string>( 24, "24"));
+						points.insert (std::pair<float,string>( 48, "48"));
+						points.insert (std::pair<float,string>( 72, "72"));
+						points.insert (std::pair<float,string>(127, "127"));
+						break;
+					case 2:
+						/* labels that don't overlay with DIN */
+						points.insert (std::pair<float,string>(  0, "0"));
+						points.insert (std::pair<float,string>( 16,  "16"));
+						points.insert (std::pair<float,string>( 40,  "40"));
+						points.insert (std::pair<float,string>( 64,  "64"));
+						points.insert (std::pair<float,string>(112, "112"));
+						points.insert (std::pair<float,string>(127, "127"));
+						break;
+					case 3:
+						/* labels that don't overlay with BBC nor EBU*/
+						points.insert (std::pair<float,string>(  0, "0"));
+						points.insert (std::pair<float,string>( 16, "16"));
+						points.insert (std::pair<float,string>( 56, "56"));
+						points.insert (std::pair<float,string>( 72, "72"));
+						points.insert (std::pair<float,string>(112, "112"));
+						points.insert (std::pair<float,string>(127, "127"));
+					default:
+						break;
+				}
+			}
+			break;
+		}
+
+		gint pos = -1;
+
+		for (std::map<float,string>::const_iterator j = points.begin(); j != points.end(); ++j) {
+			float fraction = 0;
+			bool align_center = background; // this is true for meterbridge meters w/ fixed background
+			switch (*i) {
+				case DataType::AUDIO:
+					fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first);
+
+					pos = height - (gint) floor (height * fraction);
+					pos = max (pos, 1);
+					if (tickleft) {
+						cairo_move_to(cr, width-1.5, pos + .5);
+						cairo_line_to(cr, width, pos + .5);
+						cairo_stroke (cr);
+					} else if (tickright) {
+						cairo_move_to(cr, 0, pos + .5);
+						cairo_line_to(cr, 1.5, pos + .5);
+						cairo_stroke (cr);
+					}
+					break;
+
+				case DataType::MIDI:
+					align_center = false; // don't bleed into legend
+					fraction = (j->first) / 127.0;
+					pos = 1 + height - (gint) rintf (height * fraction);
+					pos = min (pos, height);
+					cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
+					if (tickleft) {
+						cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI);
+						cairo_fill(cr);
+					} else if (tickright) {
+						cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI);
+						cairo_fill(cr);
+					}
+					break;
+			}
+
+			if (pos < 0) continue;
+
+			layout->set_text(j->second.c_str());
+
+			int tw, th;
+			layout->get_pixel_size(tw, th);
+
+			int p = pos - (th / 2) - 1;
+			p = min (p, height - th);
+			p = max (p, 0);
+
+			if (align_center) {
+				cairo_move_to (cr, (width-tw)/2.0, p);
+			} else {
+				cairo_move_to (cr, width-3-tw, p);
+			}
+
+			cairo_set_line_width(cr, 0.12);
+			cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
+			pango_cairo_layout_path(cr, layout->gobj());
+			cairo_stroke_preserve (cr);
+			cairo_set_line_width(cr, 1.0);
+
+			if ((*i) == DataType::AUDIO) {
+				mtr_col_and_fract(cr, &c, peakcolor, type, j->first);
+			} else {
+				cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
+			}
+
+			pango_cairo_show_layout (cr, layout->gobj());
+			cairo_new_path(cr);
+		}
+	}
+
+	// add legend
+	if (types.size() == 1 || overlay_midi == 0) {
+		int tw, th;
+		layout->set_attributes (unit_font_attributes);
+		switch (types.at(0)) {
+			case DataType::AUDIO:
+				switch (type) {
+					case MeterK20:
+						layout->set_text("K20");
+						break;
+					case MeterK14:
+						layout->set_text("K14");
+						break;
+					default:
+					case MeterPeak:
+					case MeterKrms:
+						layout->set_text("dBFS");
+						break;
+					case MeterIEC2EBU:
+						layout->set_text("EBU");
+						break;
+					case MeterIEC2BBC:
+						layout->set_text("BBC");
+						break;
+					case MeterIEC1DIN:
+						layout->set_text("DIN");
+						break;
+					case MeterIEC1NOR:
+						layout->set_text("NOR");
+						break;
+					case MeterVU:
+						layout->set_text("VU");
+						break;
+				}
+				layout->get_pixel_size(tw, th);
+				break;
+			case DataType::MIDI:
+				layout->set_text("mid");
+				layout->get_pixel_size(tw, th);
+				break;
+		}
+		if (!background) {
+			c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
+		}
+		cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
+		if (tickleft) {
+			cairo_move_to (cr, width - 2 - tw, height - th - 0.5);
+		} else {
+			cairo_move_to (cr, 2, height - th - 0.5);
+		}
+		pango_cairo_show_layout (cr, layout->gobj());
+	}
+
+	cairo_pattern_t* pattern = cairo_pattern_create_for_surface (surface);
+
+	cairo_destroy (cr);
+	cairo_surface_destroy (surface);
+
+	return pattern;
+}
+
+gint
+ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, MeterType type, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta)
+{
+	Glib::RefPtr<Gdk::Window> win (mta->get_window());
+	cairo_t* cr;
+
+	cr = gdk_cairo_create (win->gobj());
+
+	/* clip to expose area */
+
+	gdk_cairo_rectangle (cr, &ev->area);
+	cairo_clip (cr);
+
+	cairo_pattern_t* pattern;
+	const MeterMatricsMapKey key (mta->get_name(), type, types_to_bit(types));
+	MetricPatternMap::iterator i = ticks_patterns.find (key);
+
+	if (i == ticks_patterns.end()) {
+		pattern = meter_render_ticks (*mta, type, types);
+		ticks_patterns[key] = pattern;
+	} else {
+		pattern = i->second;
+	}
+
+	cairo_move_to (cr, 0, 0);
+	cairo_set_source (cr, pattern);
+
+	gint width, height;
+	win->get_size (width, height);
+
+	cairo_rectangle (cr, 0, 0, width, height);
+	cairo_fill (cr);
+
+	cairo_destroy (cr);
+
+	return true;
+}
+
+gint
+ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, MeterType type, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma)
+{
+	Glib::RefPtr<Gdk::Window> win (mma->get_window());
+	cairo_t* cr;
+
+	cr = gdk_cairo_create (win->gobj());
+
+	/* clip to expose area */
+
+	gdk_cairo_rectangle (cr, &ev->area);
+	cairo_clip (cr);
+
+	cairo_pattern_t* pattern;
+	const MeterMatricsMapKey key (mma->get_name(), type, types_to_bit(types));
+	MetricPatternMap::iterator i = metric_patterns.find (key);
+
+	if (i == metric_patterns.end()) {
+		pattern = meter_render_metrics (*mma, type, types);
+		metric_patterns[key] = pattern;
+	} else {
+		pattern = i->second;
+	}
+
+	cairo_move_to (cr, 0, 0);
+	cairo_set_source (cr, pattern);
+
+	gint width, height;
+	win->get_size (width, height);
+
+	cairo_rectangle (cr, 0, 0, width, height);
+	cairo_fill (cr);
+
+	cairo_destroy (cr);
+
+	return true;
+}
+
+void
+ArdourMeter::meter_clear_pattern_cache(int which) {
+	MetricPatternMap::iterator i = metric_patterns.begin();
+	MetricPatternMap::iterator j = ticks_patterns.begin();
+
+	while (i != metric_patterns.end()) {
+		int m = 4;
+		MeterMatricsMapKey const * const key = &(i->first);
+		std::string n = key->_n;
+		if (n.substr(n.length() - 4) == "Left")  { m = 1; }
+		if (n.substr(n.length() - 5) == "Right") { m = 2; }
+		if (which & m) {
+			cairo_pattern_destroy(i->second);
+			metric_patterns.erase(i++);
+		} else {
+			++i;
+		}
+	}
+
+	while (j != ticks_patterns.end()) {
+		int m = 4;
+		MeterMatricsMapKey const * const key = &(j->first);
+		std::string n = key->_n;
+		if (n.substr(n.length() - 4) == "Left")  { m = 1; }
+		if (n.substr(n.length() - 5) == "Right") { m = 2; }
+		if (which & m) {
+			cairo_pattern_destroy(j->second);
+			ticks_patterns.erase(j++);
+		} else {
+			++j;
+		}
+	}
+	RedrawMetrics();
+}
diff --git a/gtk2_ardour/meter_patterns.h b/gtk2_ardour/meter_patterns.h
new file mode 100644
index 0000000..f505ba3
--- /dev/null
+++ b/gtk2_ardour/meter_patterns.h
@@ -0,0 +1,50 @@
+/*
+    Copyright (C) 2013 Paul Davis
+    Author: 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_meter_patterns__
+#define __ardour_meter_patterns__
+
+#include <list>
+#include <vector>
+
+#include "ardour/types.h"
+#include "gtkmm2ext/cairo_widget.h"
+
+#include <sigc++/signal.h>
+
+namespace ArdourMeter {
+
+extern sigc::signal<void> ResetAllPeakDisplays;
+extern sigc::signal<void,ARDOUR::Route*> ResetRoutePeakDisplays;
+extern sigc::signal<void,ARDOUR::RouteGroup*> ResetGroupPeakDisplays;
+extern sigc::signal<void> RedrawMetrics;
+
+extern sigc::signal<void, int, ARDOUR::RouteGroup*, ARDOUR::MeterType> SetMeterTypeMulti;
+
+gint meter_expose_ticks (GdkEventExpose *ev, ARDOUR::MeterType type, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta);
+gint meter_expose_metrics (GdkEventExpose *ev, ARDOUR::MeterType type, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma);
+
+void meter_clear_pattern_cache(int which=7);
+
+const std::string meter_type_string (ARDOUR::MeterType);
+
+}
+
+#endif
+
diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc
new file mode 100644
index 0000000..703870e
--- /dev/null
+++ b/gtk2_ardour/meter_strip.cc
@@ -0,0 +1,837 @@
+/*
+    Copyright (C) 2013 Paul Davis
+    Author: 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <list>
+
+#include <sigc++/bind.h>
+
+#include "ardour/session.h"
+#include "ardour/route.h"
+#include "ardour/route_group.h"
+#include "ardour/meter.h"
+
+#include "ardour/audio_track.h"
+#include "ardour/midi_track.h"
+
+#include <gtkmm2ext/gtk_ui.h>
+#include <gtkmm2ext/keyboard.h>
+#include <gtkmm2ext/utils.h>
+#include <gtkmm2ext/rgb_macros.h>
+
+#include "ardour_ui.h"
+#include "global_signals.h"
+#include "logmeter.h"
+#include "gui_thread.h"
+#include "ardour_window.h"
+#include "utils.h"
+
+#include "meterbridge.h"
+#include "meter_strip.h"
+#include "meter_patterns.h"
+
+#include "i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using namespace Gtk;
+using namespace Gtkmm2ext;
+using namespace std;
+using namespace ArdourMeter;
+
+PBD::Signal1<void,MeterStrip*> MeterStrip::CatchDeletion;
+PBD::Signal0<void> MeterStrip::MetricChanged;
+PBD::Signal0<void> MeterStrip::ConfigurationChanged;
+
+MeterStrip::MeterStrip (int metricmode, MeterType mt)
+	: AxisView(0)
+	, RouteUI(0)
+{
+	level_meter = 0;
+	_strip_type = 0;
+	_tick_bar = 0;
+	_metricmode = -1;
+	metric_type = MeterPeak;
+	mtr_vbox.set_spacing(2);
+	nfo_vbox.set_spacing(2);
+	peakbx.set_size_request(-1, 14);
+	namebx.set_size_request(18, 52);
+	spacer.set_size_request(-1,0);
+
+	set_metric_mode(metricmode, mt);
+
+	meter_metric_area.set_size_request(25, 10);
+	meter_metric_area.signal_expose_event().connect (
+			sigc::mem_fun(*this, &MeterStrip::meter_metrics_expose));
+	RedrawMetrics.connect (sigc::mem_fun(*this, &MeterStrip::redraw_metrics));
+
+	meterbox.pack_start(meter_metric_area, true, false);
+
+	mtr_vbox.pack_start (peakbx, false, false);
+	mtr_vbox.pack_start (meterbox, true, true);
+	mtr_vbox.pack_start (spacer, false, false);
+	mtr_container.add(mtr_vbox);
+
+	mtr_hsep.set_size_request(-1,1);
+	mtr_hsep.set_name("BlackSeparator");
+
+	nfo_vbox.pack_start (mtr_hsep, false, false);
+	nfo_vbox.pack_start (btnbox, false, false);
+	nfo_vbox.pack_start (namebx, false, false);
+
+	pack_start (mtr_container, true, true);
+	pack_start (nfo_vbox, false, false);
+
+	peakbx.show();
+	btnbox.show();
+	meter_metric_area.show();
+	meterbox.show();
+	spacer.show();
+	mtr_vbox.show();
+	mtr_container.show();
+	mtr_hsep.show();
+	nfo_vbox.show();
+
+	UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed));
+	ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed));
+	DPIReset.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed));
+}
+
+MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
+	: AxisView(sess)
+	, RouteUI(sess)
+	, _route(rt)
+	, peak_display()
+{
+	mtr_vbox.set_spacing(2);
+	nfo_vbox.set_spacing(2);
+	RouteUI::set_route (rt);
+	SessionHandlePtr::set_session (sess);
+
+	_has_midi = false;
+	_tick_bar = 0;
+	_metricmode = -1;
+	metric_type = MeterPeak;
+
+	int meter_width = 6;
+	if (_route->shared_peak_meter()->input_streams().n_total() == 1) {
+		meter_width = 12;
+	}
+
+	// level meter + ticks
+	level_meter = new LevelMeterHBox(sess);
+	level_meter->set_meter (_route->shared_peak_meter().get());
+	level_meter->clear_meters();
+	level_meter->set_type (_route->meter_type());
+	level_meter->setup_meters (220, meter_width, 6);
+	level_meter->ButtonRelease.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::level_meter_button_release, this, _1));
+	level_meter->MeterTypeChanged.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::meter_type_changed, this, _1));
+
+	meter_align.set(0.5, 0.5, 0.0, 1.0);
+	meter_align.add(*level_meter);
+
+	meterbox.pack_start(meter_ticks1_area, true, false);
+	meterbox.pack_start(meter_align, true, true);
+	meterbox.pack_start(meter_ticks2_area, true, false);
+
+	// peak display
+	peak_display.set_name ("meterbridge peakindicator");
+	peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+	max_peak = minus_infinity();
+	peak_display.unset_flags (Gtk::CAN_FOCUS);
+	peak_display.set_size_request(12, 8);
+	peak_display.set_corner_radius(2);
+
+	peak_align.set(0.5, 1.0, 1.0, 0.8);
+	peak_align.add(peak_display);
+	peakbx.pack_start(peak_align, true, true, 3);
+	peakbx.set_size_request(-1, 14);
+
+	// add track-name label
+	name_label.set_text(_route->name());
+	name_label.set_corner_radius(2);
+	name_label.set_name("meterbridge label");
+	name_label.set_angle(-90.0);
+	name_label.layout()->set_ellipsize (Pango::ELLIPSIZE_END);
+	name_label.layout()->set_width(48 * PANGO_SCALE);
+	name_label.set_size_request(18, 50);
+	name_label.set_alignment(-1.0, .5);
+	ARDOUR_UI::instance()->set_tip (name_label, _route->name());
+	ARDOUR_UI::instance()->set_tip (*level_meter, _route->name());
+
+	namebx.set_size_request(18, 52);
+	namebx.pack_start(name_label, true, false, 3);
+
+	recbox.pack_start(*rec_enable_button, true, false);
+	btnbox.pack_start(recbox, false, false, 1);
+	mutebox.pack_start(*mute_button, true, false);
+	btnbox.pack_start(mutebox, false, false, 1);
+	solobox.pack_start(*solo_button, true, false);
+	btnbox.pack_start(solobox, false, false, 1);
+
+	rec_enable_button->set_corner_radius(2);
+	rec_enable_button->set_size_request(16, 16);
+
+	mute_button->set_corner_radius(2);
+	mute_button->set_size_request(16, 16);
+
+	solo_button->set_corner_radius(2);
+	solo_button->set_size_request(16, 16);
+
+	mutebox.set_size_request(16, 16);
+	solobox.set_size_request(16, 16);
+	recbox.set_size_request(16, 16);
+	spacer.set_size_request(-1,0);
+
+	update_button_box();
+	update_name_box();
+	update_background (_route->meter_type());
+
+	mtr_vbox.pack_start (peakbx, false, false);
+	mtr_vbox.pack_start (meterbox, true, true);
+	mtr_vbox.pack_start (spacer, false, false);
+	mtr_container.add(mtr_vbox);
+
+	mtr_hsep.set_size_request(-1,1);
+	mtr_hsep.set_name("BlackSeparator");
+
+	nfo_vbox.pack_start (mtr_hsep, false, false);
+	nfo_vbox.pack_start (btnbox, false, false);
+	nfo_vbox.pack_start (namebx, false, false);
+
+	pack_start (mtr_container, true, true);
+	pack_start (nfo_vbox, false, false);
+
+	name_label.show();
+	peak_display.show();
+	peakbx.show();
+	meter_ticks1_area.show();
+	meter_ticks2_area.show();
+	meterbox.show();
+	spacer.show();
+	level_meter->show();
+	meter_align.show();
+	peak_align.show();
+	btnbox.show();
+	mtr_vbox.show();
+	mtr_container.show();
+	mtr_hsep.show();
+	nfo_vbox.show();
+
+	_route->shared_peak_meter()->ConfigurationChanged.connect (
+			route_connections, invalidator (*this), boost::bind (&MeterStrip::meter_configuration_changed, this, _1), gui_context()
+			);
+
+	ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &MeterStrip::reset_peak_display));
+	ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &MeterStrip::reset_route_peak_display));
+	ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &MeterStrip::reset_group_peak_display));
+	RedrawMetrics.connect (sigc::mem_fun(*this, &MeterStrip::redraw_metrics));
+	SetMeterTypeMulti.connect (sigc::mem_fun(*this, &MeterStrip::set_meter_type_multi));
+
+	meter_configuration_changed (_route->shared_peak_meter()->input_streams ());
+
+	meter_ticks1_area.set_size_request(3,-1);
+	meter_ticks2_area.set_size_request(3,-1);
+	meter_ticks1_area.signal_expose_event().connect (sigc::mem_fun(*this, &MeterStrip::meter_ticks1_expose));
+	meter_ticks2_area.signal_expose_event().connect (sigc::mem_fun(*this, &MeterStrip::meter_ticks2_expose));
+
+	_route->DropReferences.connect (route_connections, invalidator (*this), boost::bind (&MeterStrip::self_delete, this), gui_context());
+	_route->PropertyChanged.connect (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);
+
+	UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed));
+	ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed));
+	DPIReset.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed));
+	Config->ParameterChanged.connect (*this, invalidator (*this), ui_bind (&MeterStrip::parameter_changed, this, _1), gui_context());
+	sess->config.ParameterChanged.connect (*this, invalidator (*this), ui_bind (&MeterStrip::parameter_changed, this, _1), gui_context());
+
+	if (_route->is_master()) {
+		_strip_type = 4;
+	}
+	else if (boost::dynamic_pointer_cast<AudioTrack>(_route) == 0
+			&& boost::dynamic_pointer_cast<MidiTrack>(_route) == 0) {
+		/* non-master bus */
+		_strip_type = 3;
+	}
+	else if (boost::dynamic_pointer_cast<MidiTrack>(_route)) {
+		_strip_type = 2;
+	}
+	else {
+		_strip_type = 1;
+	}
+}
+
+MeterStrip::~MeterStrip ()
+{
+	if (level_meter) {
+		delete level_meter;
+		CatchDeletion (this);
+	}
+}
+
+void
+MeterStrip::self_delete ()
+{
+	delete this;
+}
+
+void
+MeterStrip::set_session (Session* s)
+{
+	SessionHandlePtr::set_session (s);
+	if (!s) return;
+	s->config.ParameterChanged.connect (*this, invalidator (*this), ui_bind (&MeterStrip::parameter_changed, this, _1), gui_context());
+	update_button_box();
+	update_name_box();
+}
+
+void
+MeterStrip::update_rec_display ()
+{
+	RouteUI::update_rec_display ();
+}
+
+std::string
+MeterStrip::state_id() const
+{
+	return string_compose ("mtrs %1", _route->id().to_s());
+}
+
+void
+MeterStrip::set_button_names()
+{
+	mute_button->set_text (_("M"));
+	rec_enable_button->set_text ("");
+	rec_enable_button->set_image (::get_icon (X_("record_normal_red")));
+
+	if (_route && _route->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));
+	}
+	if (!Config->get_solo_control_is_listen_control()) {
+		solo_button->set_text (_("S"));
+	} else {
+		switch (Config->get_listen_position()) {
+		case AfterFaderListen:
+			solo_button->set_text (_("A"));
+			break;
+		case PreFaderListen:
+			solo_button->set_text (_("P"));
+			break;
+		}
+	}
+
+}
+
+void
+MeterStrip::strip_property_changed (const PropertyChange& what_changed)
+{
+	if (!what_changed.contains (ARDOUR::Properties::name)) {
+		return;
+	}
+	ENSURE_GUI_THREAD (*this, &MeterStrip::strip_name_changed, what_changed)
+	name_label.set_text(_route->name());
+	ARDOUR_UI::instance()->set_tip (name_label, _route->name());
+	if (level_meter) {
+		ARDOUR_UI::instance()->set_tip (*level_meter, _route->name());
+	}
+}
+
+void
+MeterStrip::fast_update ()
+{
+	float mpeak = level_meter->update_meters();
+	if (mpeak > max_peak) {
+		max_peak = mpeak;
+		if (mpeak >= Config->get_meter_peak()) {
+			peak_display.set_name ("meterbridge peakindicator on");
+			peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+		}
+	}
+}
+
+void
+MeterStrip::on_theme_changed()
+{
+	if (level_meter && _route) {
+		int meter_width = 6;
+		if (_route->shared_peak_meter()->input_streams().n_total() == 1) {
+			meter_width = 12;
+		}
+		level_meter->setup_meters (220, meter_width, 6);
+	}
+}
+
+void
+MeterStrip::meter_configuration_changed (ChanCount c)
+{
+	int type = 0;
+	_types.clear ();
+	bool old_has_midi = _has_midi;
+
+	for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
+		if (c.get (*i) > 0) {
+			_types.push_back (*i);
+			type |= 1 << (*i);
+		}
+	}
+
+	if (boost::dynamic_pointer_cast<AudioTrack>(_route) == 0
+			&& boost::dynamic_pointer_cast<MidiTrack>(_route) == 0
+			) {
+		meter_ticks1_area.set_name ("MyAudioBusMetricsLeft");
+		meter_ticks2_area.set_name ("MyAudioBusMetricsRight");
+		_has_midi = false;
+	}
+	else if (type == (1 << DataType::AUDIO)) {
+		meter_ticks1_area.set_name ("MyAudioTrackMetricsLeft");
+		meter_ticks2_area.set_name ("MyAudioTrackMetricsRight");
+		_has_midi = false;
+	}
+	else if (type == (1 << DataType::MIDI)) {
+		meter_ticks1_area.set_name ("MidiTrackMetricsLeft");
+		meter_ticks2_area.set_name ("MidiTrackMetricsRight");
+		_has_midi = true;
+	} else {
+		meter_ticks1_area.set_name ("AudioMidiTrackMetricsLeft");
+		meter_ticks2_area.set_name ("AudioMidiTrackMetricsRight");
+		_has_midi = true;
+	}
+	set_tick_bar(_tick_bar);
+
+	on_theme_changed();
+	if (old_has_midi != _has_midi) MetricChanged();
+	else ConfigurationChanged();
+}
+
+void
+MeterStrip::set_tick_bar (int m)
+{
+	std::string n;
+	_tick_bar = m;
+	if (_tick_bar & 1) {
+		n = meter_ticks1_area.get_name();
+		if (n.substr(0,3) != "Bar") {
+			meter_ticks1_area.set_name("Bar" + n);
+		}
+	} else {
+		n = meter_ticks1_area.get_name();
+		if (n.substr(0,3) == "Bar") {
+			meter_ticks1_area.set_name(n.substr(3,-1));
+		}
+	}
+	if (_tick_bar & 2) {
+		n = meter_ticks2_area.get_name();
+		if (n.substr(0,3) != "Bar") {
+			meter_ticks2_area.set_name("Bar" + n);
+		}
+	} else {
+		n = meter_ticks2_area.get_name();
+		if (n.substr(0,3) == "Bar") {
+			meter_ticks2_area.set_name(n.substr(3,-1));
+		}
+	}
+}
+
+void
+MeterStrip::on_size_request (Gtk::Requisition* r)
+{
+	VBox::on_size_request(r);
+}
+
+void
+MeterStrip::on_size_allocate (Gtk::Allocation& a)
+{
+	const int wh = a.get_height();
+	int nh;
+	int mh = 0;
+	if (_session) {
+		mh = _session->config.get_meterbridge_label_height();
+	}
+	switch (mh) {
+		default:
+		case 0:
+			nh = ceilf(wh * .12f);
+			if (nh < 52) nh = 52;
+			if (nh > 148) nh = 148;
+			break;
+		case 1:
+			nh = 52;
+			break;
+		case 2:
+			nh = 88;
+			break;
+		case 3:
+			nh = 106;
+			break;
+		case 4:
+			nh = 148;
+			break;
+	}
+	namebx.set_size_request(18, nh);
+	if (_route) {
+		name_label.set_size_request(18, nh-2);
+		name_label.layout()->set_width((nh-4) * PANGO_SCALE);
+	}
+	VBox::on_size_allocate(a);
+}
+
+gint
+MeterStrip::meter_metrics_expose (GdkEventExpose *ev)
+{
+	if (_route) {
+		return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area);
+	} else {
+		return meter_expose_metrics(ev, metric_type, _types, &meter_metric_area);
+	}
+}
+
+void
+MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt)
+{
+	if (metric_type == mt && _metricmode == metricmode) {
+		return;
+	}
+	metric_type = mt;
+	_metricmode = metricmode;
+
+	_types.clear ();
+	switch(metricmode) {
+		case 0:
+			meter_metric_area.set_name ("MidiTrackMetricsLeft");
+			_types.push_back (DataType::MIDI);
+			break;
+		case 1:
+			meter_metric_area.set_name ("AudioTrackMetricsLeft");
+			_types.push_back (DataType::AUDIO);
+			break;
+		case 2:
+			meter_metric_area.set_name ("MidiTrackMetricsRight");
+			_types.push_back (DataType::MIDI);
+			break;
+		case 3:
+		default:
+			meter_metric_area.set_name ("AudioTrackMetricsRight");
+			_types.push_back (DataType::AUDIO);
+			break;
+	}
+	update_background (mt);
+	meter_metric_area.queue_draw ();
+}
+
+void
+MeterStrip::update_background(MeterType type)
+{
+	switch(type) {
+		case MeterIEC1DIN:
+		case MeterIEC1NOR:
+		case MeterIEC2BBC:
+		case MeterIEC2EBU:
+		case MeterK14:
+		case MeterK20:
+			mtr_container.set_name ("meterstripPPM");
+			break;
+		case MeterVU:
+			mtr_container.set_name ("meterstripVU");
+			break;
+		default:
+			mtr_container.set_name ("meterstripDPM");
+	}
+}
+
+MeterType
+MeterStrip::meter_type()
+{
+	assert((!_route && _strip_type == 0) || (_route && _strip_type != 0));
+	if (!_route) return metric_type;
+	return _route->meter_type();
+}
+
+gint
+MeterStrip::meter_ticks1_expose (GdkEventExpose *ev)
+{
+	assert(_route);
+	return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area);
+}
+
+gint
+MeterStrip::meter_ticks2_expose (GdkEventExpose *ev)
+{
+	assert(_route);
+	return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area);
+}
+
+void
+MeterStrip::reset_route_peak_display (Route* route)
+{
+	if (_route && _route.get() == route) {
+		reset_peak_display ();
+	}
+}
+
+void
+MeterStrip::reset_group_peak_display (RouteGroup* group)
+{
+	if (_route && group == _route->route_group()) {
+		reset_peak_display ();
+	}
+}
+
+void
+MeterStrip::reset_peak_display ()
+{
+	_route->shared_peak_meter()->reset_max();
+	level_meter->clear_meters();
+	max_peak = -INFINITY;
+	peak_display.set_name ("meterbridge peakindicator");
+	peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+}
+
+bool
+MeterStrip::peak_button_release (GdkEventButton* ev)
+{
+	if (ev->button == 1 && Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) {
+		ResetAllPeakDisplays ();
+	} else if (ev->button == 1 && Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
+		if (_route) {
+			ResetGroupPeakDisplays (_route->route_group());
+		}
+	} else {
+		ResetRoutePeakDisplays (_route.get());
+	}
+	return true;
+}
+
+void
+MeterStrip::redraw_metrics ()
+{
+	meter_metric_area.queue_draw();
+	meter_ticks1_area.queue_draw();
+	meter_ticks2_area.queue_draw();
+}
+
+void
+MeterStrip::update_button_box ()
+{
+	if (!_session) return;
+	int height = 0;
+	if (_session->config.get_show_mute_on_meterbridge()) {
+		height += 18;
+		mutebox.show();
+	} else {
+		mutebox.hide();
+	}
+	if (_session->config.get_show_solo_on_meterbridge()) {
+		height += 18;
+		solobox.show();
+	} else {
+		solobox.hide();
+	}
+	if (_session->config.get_show_rec_on_meterbridge()) {
+		height += 18;
+		recbox.show();
+	} else {
+		recbox.hide();
+	}
+	btnbox.set_size_request(16, height);
+	check_resize();
+}
+
+void
+MeterStrip::update_name_box ()
+{
+	if (!_session) return;
+	if (_session->config.get_show_name_on_meterbridge()) {
+		namebx.show();
+	} else {
+		namebx.hide();
+	}
+}
+
+void
+MeterStrip::parameter_changed (std::string const & p)
+{
+	if (p == "meter-peak") {
+		max_peak = -INFINITY;
+	}
+	else if (p == "show-rec-on-meterbridge") {
+		update_button_box();
+	}
+	else if (p == "show-mute-on-meterbridge") {
+		update_button_box();
+	}
+	else if (p == "show-solo-on-meterbridge") {
+		update_button_box();
+	}
+	else if (p == "show-name-on-meterbridge") {
+		update_name_box();
+	}
+	else if (p == "meterbridge-label-height") {
+		queue_resize();
+	}
+}
+
+bool
+MeterStrip::level_meter_button_release (GdkEventButton* ev)
+{
+	if (ev->button == 3) {
+		popup_level_meter_menu (ev);
+		return true;
+	}
+
+	return false;
+}
+
+void
+MeterStrip::popup_level_meter_menu (GdkEventButton* ev)
+{
+	using namespace Gtk::Menu_Helpers;
+
+	Gtk::Menu* m = manage (new Menu);
+	MenuList& items = m->items ();
+
+	RadioMenuItem::Group group;
+
+	_suspend_menu_callbacks = true;
+	add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak);
+	add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterKrms),  MeterKrms);
+	add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN);
+	add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR);
+	add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC);
+	add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU);
+	add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20);
+	add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14);
+	add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterVU),  MeterVU);
+
+	MeterType cmt = _route->meter_type();
+	const std::string cmn = ArdourMeter::meter_type_string(cmt);
+
+	items.push_back (SeparatorElem());
+	items.push_back (MenuElem (string_compose(_("Change all in Group to %1"), cmn),
+				sigc::bind (SetMeterTypeMulti, -1, _route->route_group(), cmt)));
+	items.push_back (MenuElem (string_compose(_("Change all to %1"), cmn),
+				sigc::bind (SetMeterTypeMulti, 0, _route->route_group(), cmt)));
+	items.push_back (MenuElem (string_compose(_("Change same track-type to %1"), cmn),
+				sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), cmt)));
+
+	m->popup (ev->button, ev->time);
+	_suspend_menu_callbacks = false;
+}
+
+bool
+MeterStrip::name_label_button_release (GdkEventButton* ev)
+{
+	if (!_session) return true;
+	if (!_session->config.get_show_name_on_meterbridge()) return true;
+
+	if (ev->button == 3) {
+		popup_name_label_menu (ev);
+		return true;
+	}
+
+	return false;
+}
+
+void
+MeterStrip::popup_name_label_menu (GdkEventButton* ev)
+{
+	using namespace Gtk::Menu_Helpers;
+
+	Gtk::Menu* m = manage (new Menu);
+	MenuList& items = m->items ();
+
+	RadioMenuItem::Group group;
+
+	_suspend_menu_callbacks = true;
+	add_label_height_item (items, group, _("Variable height"), 0);
+	add_label_height_item (items, group, _("Short"), 1);
+	add_label_height_item (items, group, _("Tall"), 2);
+	add_label_height_item (items, group, _("Grande"), 3);
+	add_label_height_item (items, group, _("Venti"), 4);
+
+	m->popup (ev->button, ev->time);
+	_suspend_menu_callbacks = false;
+}
+
+void
+MeterStrip::add_label_height_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, uint32_t h)
+{
+	using namespace Menu_Helpers;
+
+	items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (*this, &MeterStrip::set_label_height), h)));
+	RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ());
+	i->set_active (_session && _session->config.get_meterbridge_label_height() == h);
+}
+
+void
+MeterStrip::add_level_meter_type_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterType type)
+{
+	using namespace Menu_Helpers;
+
+	items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (*this, &MeterStrip::set_meter_type), type)));
+	RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ());
+	i->set_active (_route->meter_type() == type);
+}
+
+void
+MeterStrip::set_meter_type (MeterType type)
+{
+	if (_suspend_menu_callbacks) return;
+	if (_route->meter_type() == type) return;
+
+	level_meter->set_type (type);
+}
+
+void
+MeterStrip::set_label_height (uint32_t h)
+{
+	if (_suspend_menu_callbacks) return;
+	_session->config.set_meterbridge_label_height(h);
+}
+
+void
+MeterStrip::meter_type_changed (MeterType type)
+{
+	if (_route->meter_type() != type) {
+		_route->set_meter_type(type);
+	}
+	update_background (type);
+	MetricChanged();
+}
+
+void
+MeterStrip::set_meter_type_multi (int what, RouteGroup* group, MeterType type)
+{
+	switch (what) {
+		case -1:
+			if (_route && group == _route->route_group()) {
+				level_meter->set_type (type);
+			}
+			break;
+		case 0:
+			level_meter->set_type (type);
+		default:
+			if (what == _strip_type) {
+				level_meter->set_type (type);
+			}
+			break;
+	}
+}
diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h
new file mode 100644
index 0000000..e817f7d
--- /dev/null
+++ b/gtk2_ardour/meter_strip.h
@@ -0,0 +1,155 @@
+/*
+    Copyright (C) 2013 Paul Davis
+    Author: 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_meter_strip__
+#define __ardour_meter_strip__
+
+#include <vector>
+
+#include <cmath>
+
+#include "pbd/stateful.h"
+
+#include "ardour/types.h"
+#include "ardour/ardour.h"
+#include "route_ui.h"
+#include "ardour_button.h"
+
+#include "level_meter.h"
+
+namespace ARDOUR {
+	class Route;
+	class RouteGroup;
+	class Session;
+}
+namespace Gtk {
+	class Window;
+	class Style;
+}
+
+class MeterStrip : public Gtk::VBox, public RouteUI
+{
+  public:
+	MeterStrip (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>);
+	MeterStrip (int, ARDOUR::MeterType);
+	~MeterStrip ();
+
+	void set_session (ARDOUR::Session* s);
+	void fast_update ();
+	boost::shared_ptr<ARDOUR::Route> route() { return _route; }
+
+	static PBD::Signal1<void,MeterStrip*> CatchDeletion;
+	static PBD::Signal0<void> MetricChanged;
+	static PBD::Signal0<void> ConfigurationChanged;
+
+	void reset_peak_display ();
+	void reset_route_peak_display (ARDOUR::Route*);
+	void reset_group_peak_display (ARDOUR::RouteGroup*);
+
+	void set_meter_type_multi (int, ARDOUR::RouteGroup*, ARDOUR::MeterType);
+
+	void set_metric_mode (int, ARDOUR::MeterType);
+	int  get_metric_mode() { return _metricmode; }
+	void set_tick_bar (int);
+	int  get_tick_bar() { return _tick_bar; }
+	bool has_midi() { return _has_midi; }
+	bool is_metric_display() { return _strip_type == 0; }
+	ARDOUR::MeterType meter_type();
+
+  protected:
+	boost::shared_ptr<ARDOUR::Route> _route;
+	PBD::ScopedConnectionList route_connections;
+	PBD::ScopedConnectionList level_meter_connection;
+	void self_delete ();
+
+	gint meter_metrics_expose (GdkEventExpose *);
+	gint meter_ticks1_expose (GdkEventExpose *);
+	gint meter_ticks2_expose (GdkEventExpose *);
+
+	void on_theme_changed ();
+
+	void on_size_allocate (Gtk::Allocation&);
+	void on_size_request (Gtk::Requisition*);
+
+	/* route UI */
+	void update_rec_display ();
+	std::string state_id() const;
+	void set_button_names ();
+
+  private:
+	Gtk::VBox mtr_vbox;
+	Gtk::VBox nfo_vbox;
+	Gtk::EventBox mtr_container;
+	Gtk::HSeparator mtr_hsep;
+	Gtk::HBox meterbox;
+	Gtk::HBox spacer;
+	Gtk::HBox namebx;
+	ArdourButton name_label;
+	Gtk::DrawingArea meter_metric_area;
+	Gtk::DrawingArea meter_ticks1_area;
+	Gtk::DrawingArea meter_ticks2_area;
+
+	Gtk::HBox mutebox;
+	Gtk::HBox solobox;
+	Gtk::HBox recbox;
+
+	Gtk::Alignment meter_align;
+	Gtk::Alignment peak_align;
+	Gtk::HBox peakbx;
+	Gtk::VBox btnbox;
+	ArdourButton peak_display;
+
+	std::vector<ARDOUR::DataType> _types;
+	ARDOUR::MeterType metric_type;
+
+	float max_peak;
+	bool _has_midi;
+	int _tick_bar;
+	int _strip_type;
+	int _metricmode;
+
+	LevelMeterHBox *level_meter;
+
+	PBD::ScopedConnection _config_connection;
+	void strip_property_changed (const PBD::PropertyChange&);
+	void meter_configuration_changed (ARDOUR::ChanCount);
+	void meter_type_changed (ARDOUR::MeterType);
+	void update_background (ARDOUR::MeterType);
+
+	bool peak_button_release (GdkEventButton*);
+
+	void parameter_changed (std::string const & p);
+	void redraw_metrics ();
+	void update_button_box ();
+	void update_name_box ();
+
+	bool _suspend_menu_callbacks;
+	bool level_meter_button_release (GdkEventButton* ev);
+	void popup_level_meter_menu (GdkEventButton* ev);
+	void add_level_meter_type_item (Gtk::Menu_Helpers::MenuList&, Gtk::RadioMenuItem::Group&, std::string const &, ARDOUR::MeterType);
+
+	bool name_label_button_release (GdkEventButton* ev);
+	void popup_name_label_menu (GdkEventButton* ev);
+	void add_label_height_item (Gtk::Menu_Helpers::MenuList&, Gtk::RadioMenuItem::Group&, std::string const &, uint32_t);
+
+	void set_meter_type (ARDOUR::MeterType mode);
+	void set_label_height (uint32_t);
+};
+
+#endif /* __ardour_mixer_strip__ */
diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc
new file mode 100644
index 0000000..4a4f1dd
--- /dev/null
+++ b/gtk2_ardour/meterbridge.cc
@@ -0,0 +1,821 @@
+/*
+    Copyright (C) 2012 Paul Davis
+    Author: 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifdef WAF_BUILD
+#include "gtk2ardour-config.h"
+#endif
+
+#include <map>
+#include <sigc++/bind.h>
+
+#include <gtkmm/accelmap.h>
+
+#include <glibmm/threads.h>
+
+#include <gtkmm2ext/gtk_ui.h>
+#include <gtkmm2ext/utils.h>
+#include <gtkmm2ext/window_title.h>
+
+#include "ardour/debug.h"
+#include "ardour/midi_track.h"
+#include "ardour/route_group.h"
+#include "ardour/session.h"
+
+#include "ardour/audio_track.h"
+#include "ardour/midi_track.h"
+
+#include "meterbridge.h"
+
+#include "keyboard.h"
+#include "monitor_section.h"
+#include "public_editor.h"
+#include "ardour_ui.h"
+#include "utils.h"
+#include "route_sorter.h"
+#include "actions.h"
+#include "gui_thread.h"
+#include "global_signals.h"
+#include "meter_patterns.h"
+
+#include "i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using namespace Gtk;
+using namespace Glib;
+using namespace Gtkmm2ext;
+using namespace std;
+using namespace ArdourMeter;
+
+using PBD::atoi;
+
+Meterbridge* Meterbridge::_instance = 0;
+
+Meterbridge*
+Meterbridge::instance ()
+{
+	if (!_instance) {
+		_instance  = new Meterbridge;
+	}
+
+	return _instance;
+}
+
+/* copy from gtk2_ardour/mixer_ui.cc -- TODO consolidate
+ * used by Meterbridge::set_session() below
+ */
+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 (MixerSort) < b->order_key (MixerSort);
+	}
+};
+
+Meterbridge::Meterbridge ()
+	: Window (Gtk::WINDOW_TOPLEVEL)
+	, VisibilityTracker (*((Gtk::Window*) this))
+	, _visible (false)
+	, _show_busses (false)
+	, metrics_left (1, MeterPeak)
+	, metrics_right (2, MeterPeak)
+	, cur_max_width (-1)
+{
+	set_name ("Meter Bridge");
+
+	m_width = default_width;
+	m_height = default_height;
+	m_root_x = 1;
+	m_root_y = 1;
+
+	update_title ();
+
+	set_wmclass (X_("ardour_mixer"), PROGRAM_NAME);
+
+	Gdk::Geometry geom;
+	geom.max_width = 1<<16;
+	geom.max_height = max_height;
+	geom.height_inc = 16;
+	geom.width_inc = 1;
+	set_geometry_hints(*((Gtk::Window*) this), geom, Gdk::HINT_MAX_SIZE | Gdk::HINT_RESIZE_INC);
+
+	set_keep_above (true);
+	set_border_width (0);
+
+	metrics_vpacker_left.pack_start (metrics_left, true, true);
+	metrics_vpacker_left.pack_start (metrics_spacer_left, false, false);
+	metrics_spacer_left.set_size_request(-1, 0);
+	metrics_spacer_left.set_spacing(0);
+
+	metrics_vpacker_right.pack_start (metrics_right, true, true);
+	metrics_vpacker_right.pack_start (metrics_spacer_right, false, false);
+	metrics_spacer_right.set_size_request(-1, 0);
+	metrics_spacer_right.set_spacing(0);
+
+	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, _1), 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());
+
+	/* work around ScrolledWindowViewport alignment mess Part one */
+	Gtk::HBox * yspc = manage (new Gtk::HBox());
+	yspc->set_size_request(-1, 1);
+	Gtk::VBox * xspc = manage (new Gtk::VBox());
+	xspc->pack_start(meterarea, true, true);
+	xspc->pack_start(*yspc, false, false);
+	yspc->show();
+	xspc->show();
+
+	meterarea.set_spacing(0);
+	scroller.set_shadow_type(Gtk::SHADOW_NONE);
+	scroller.set_border_width(0);
+	scroller.add (*xspc);
+	scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER);
+
+	global_hpacker.pack_start (metrics_vpacker_left, false, false);
+	global_hpacker.pack_start (scroller, true, true);
+	global_hpacker.pack_start (metrics_vpacker_right, false, false);
+
+	global_vpacker.pack_start (global_hpacker, true, true);
+	add (global_vpacker);
+
+	metrics_left.show();
+	metrics_right.show();
+
+	metrics_vpacker_left.show();
+	metrics_spacer_left.show();
+	metrics_vpacker_right.show();
+	metrics_spacer_right.show();
+
+	meterarea.show();
+	global_vpacker.show();
+	global_hpacker.show();
+	scroller.show();
+
+	/* the return of the ScrolledWindowViewport mess:
+	 * remove shadow from scrollWindow's viewport
+	 * see http://www.mail-archive.com/gtkmm-list@gnome.org/msg03509.html
+	 */
+	Gtk::Viewport* viewport = (Gtk::Viewport*) scroller.get_child();
+	viewport->set_shadow_type(Gtk::SHADOW_NONE);
+	viewport->set_border_width(0);
+
+	UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &Meterbridge::on_theme_changed));
+	ColorsChanged.connect (sigc::mem_fun (*this, &Meterbridge::on_theme_changed));
+	DPIReset.connect (sigc::mem_fun (*this, &Meterbridge::on_theme_changed));
+}
+
+Meterbridge::~Meterbridge ()
+{
+	while (_metrics.size() > 0) {
+		delete (_metrics.back());
+		_metrics.pop_back();
+	}
+}
+
+void
+Meterbridge::show_window ()
+{
+	present();
+	if (!_visible) {
+		set_window_pos_and_size ();
+	}
+	_visible = true;
+}
+
+/* code duplicated from gtk2_ardour/mixer_ui.cc  Mixer_UI::update_title() */
+void
+Meterbridge::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|Meterbridge");
+		title += Glib::get_application_name ();
+		set_title (title.get_string());
+
+	} else {
+
+		WindowTitle title (S_("Window|Meterbridge"));
+		title += Glib::get_application_name ();
+		set_title (title.get_string());
+	}
+}
+
+void
+Meterbridge::set_window_pos_and_size ()
+{
+	resize (m_width, m_height);
+	if (m_root_x >= 0 && m_root_y >= 0) {
+		move (m_root_x, m_root_y);
+	}
+}
+
+void
+Meterbridge::get_window_pos_and_size ()
+{
+	get_position(m_root_x, m_root_y);
+	get_size(m_width, m_height);
+}
+
+bool
+Meterbridge::hide_window (GdkEventAny *ev)
+{
+	if (!_visible) return 0;
+	get_window_pos_and_size();
+	_visible = false;
+	return just_hide_it(ev, static_cast<Gtk::Window *>(this));
+}
+
+bool
+Meterbridge::on_key_press_event (GdkEventKey* ev)
+{
+	if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
+		return true;
+	}
+	return forward_key_press (ev);
+}
+
+bool
+Meterbridge::on_key_release_event (GdkEventKey* ev)
+{
+	if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
+		return true;
+	}
+	/* don't forward releases */
+	return true;
+}
+
+bool
+Meterbridge::on_scroll_event (GdkEventScroll* ev)
+{
+	switch (ev->direction) {
+	case GDK_SCROLL_LEFT:
+		scroll_left ();
+		return true;
+	case GDK_SCROLL_UP:
+		if (ev->state & Keyboard::TertiaryModifier) {
+			scroll_left ();
+			return true;
+		}
+		return false;
+
+	case GDK_SCROLL_RIGHT:
+		scroll_right ();
+		return true;
+
+	case GDK_SCROLL_DOWN:
+		if (ev->state & Keyboard::TertiaryModifier) {
+			scroll_right ();
+			return true;
+		}
+		return false;
+	}
+
+	return false;
+}
+
+void
+Meterbridge::scroll_left ()
+{
+	if (!scroller.get_hscrollbar()) return;
+	Adjustment* adj = scroller.get_hscrollbar()->get_adjustment();
+	/* stupid GTK: can't rely on clamping across versions */
+	scroller.get_hscrollbar()->set_value (max (adj->get_lower(), adj->get_value() - adj->get_step_increment()));
+}
+
+void
+Meterbridge::scroll_right ()
+{
+	if (!scroller.get_hscrollbar()) return;
+	Adjustment* adj = scroller.get_hscrollbar()->get_adjustment();
+	/* stupid GTK: can't rely on clamping across versions */
+	scroller.get_hscrollbar()->set_value (min (adj->get_upper(), adj->get_value() + adj->get_step_increment()));
+}
+
+void
+Meterbridge::on_size_request (Gtk::Requisition* r)
+{
+	meter_clear_pattern_cache(3);
+	Gtk::Window::on_size_request(r);
+
+	Gdk::Geometry geom;
+	Gtk::Requisition mr = meterarea.size_request();
+
+	geom.max_width = mr.width + metrics_left.get_width() + metrics_right.get_width();
+	geom.max_height = max_height;
+
+#ifndef GTKOSX
+	/* on OSX this leads to a constant live-loop: show/hide scrollbar
+	 * on Linux, the window is resized IFF the scrollbar was not visible
+	 */
+	const Gtk::Scrollbar * hsc = scroller.get_hscrollbar();
+	Glib::RefPtr<Gdk::Screen> screen = get_screen ();
+	Gdk::Rectangle monitor_rect;
+	screen->get_monitor_geometry (0, monitor_rect);
+	const int scr_w = monitor_rect.get_width() - 44;
+
+	if (cur_max_width < geom.max_width
+			&& cur_max_width < scr_w
+			&& !(scroller.get_hscrollbar_visible() && hsc)) {
+		int h = r->height;
+		*r = Gtk::Requisition();
+		r->width = geom.max_width;
+		r->height = h;
+	}
+#endif
+
+	if (cur_max_width != geom.max_width) {
+		cur_max_width = geom.max_width;
+		geom.height_inc = 16;
+		geom.width_inc = 1;
+		set_geometry_hints(*((Gtk::Window*) this), geom, Gdk::HINT_MAX_SIZE | Gdk::HINT_RESIZE_INC);
+	}
+}
+
+void
+Meterbridge::on_size_allocate (Gtk::Allocation& a)
+{
+	const Gtk::Scrollbar * hsc = scroller.get_hscrollbar();
+
+	if (scroller.get_hscrollbar_visible() && hsc) {
+		if (!scroll_connection.connected()) {
+			scroll_connection = scroller.get_hscrollbar()->get_adjustment()->signal_value_changed().connect(sigc::mem_fun (*this, &Meterbridge::on_scroll));
+			scroller.get_hscrollbar()->get_adjustment()->signal_changed().connect(sigc::mem_fun (*this, &Meterbridge::on_scroll));
+		}
+		gint scrollbar_spacing;
+		gtk_widget_style_get (GTK_WIDGET (scroller.gobj()),
+				"scrollbar-spacing", &scrollbar_spacing, NULL);
+		const int h = hsc->get_height() + scrollbar_spacing + 1;
+		metrics_spacer_left.set_size_request(-1, h);
+		metrics_spacer_right.set_size_request(-1, h);
+	} else {
+		metrics_spacer_left.set_size_request(-1, 0);
+		metrics_spacer_right.set_size_request(-1, 0);
+	}
+	Gtk::Window::on_size_allocate(a);
+}
+
+void
+Meterbridge::on_scroll()
+{
+	if (!scroller.get_hscrollbar()) return;
+
+	Adjustment* adj = scroller.get_hscrollbar()->get_adjustment();
+	int leftend = adj->get_value();
+	int rightend = scroller.get_width() + leftend;
+
+	int mm_left = _mm_left;
+	int mm_right = _mm_right;
+	ARDOUR::MeterType mt_left = _mt_left;
+	ARDOUR::MeterType mt_right = _mt_right;
+
+	for (unsigned int i = 0; i < _metrics.size(); ++i) {
+		int sx, dx, dy;
+		int mm = _metrics[i]->get_metric_mode();
+		sx = (mm & 2) ? _metrics[i]->get_width() : 0;
+
+		_metrics[i]->translate_coordinates(meterarea, sx, 0, dx, dy);
+
+		if (dx < leftend && !(mm&2)) {
+			mm_left = mm;
+			mt_left = _metrics[i]->meter_type();
+		}
+		if (dx > rightend && (mm&2)) {
+			mm_right = mm;
+			mt_right = _metrics[i]->meter_type();
+			break;
+		}
+	}
+	metrics_left.set_metric_mode(mm_left, mt_left);
+	metrics_right.set_metric_mode(mm_right, mt_right);
+}
+
+void
+Meterbridge::set_session (Session* s)
+{
+	SessionHandlePtr::set_session (s);
+
+	if (!_session) {
+		return;
+	}
+
+	metrics_left.set_session(s);
+	metrics_right.set_session(s);
+
+	XMLNode* node = _session->instant_xml(X_("Meterbridge"));
+	if (node) {
+		set_state (*node);
+	}
+
+	update_title ();
+	_show_busses = _session->config.get_show_busses_on_meterbridge();
+	_show_master = _session->config.get_show_master_on_meterbridge();
+	_show_midi = _session->config.get_show_midi_on_meterbridge();
+
+	SignalOrderRouteSorter sorter;
+	boost::shared_ptr<RouteList> routes = _session->get_routes();
+
+	RouteList copy(*routes);
+	copy.sort(sorter);
+	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());
+	_session->StateSaved.connect (_session_connections, invalidator (*this), boost::bind (&Meterbridge::update_title, this), gui_context());
+	_session->config.ParameterChanged.connect (*this, invalidator (*this), ui_bind (&Meterbridge::parameter_changed, this, _1), gui_context());
+	Config->ParameterChanged.connect (*this, invalidator (*this), ui_bind (&Meterbridge::parameter_changed, this, _1), gui_context());
+
+	if (_visible) {
+		show_window();
+		ActionManager::check_toggleaction ("<Actions>/Common/toggle-meterbridge");
+	}
+	start_updating ();
+}
+
+void
+Meterbridge::session_going_away ()
+{
+	ENSURE_GUI_THREAD (*this, &Meterbridge::session_going_away);
+
+	for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) {
+		delete ((*i).s);
+	}
+
+	strips.clear ();
+	stop_updating ();
+
+	SessionHandlePtr::session_going_away ();
+
+	_session = 0;
+	update_title ();
+}
+
+int
+Meterbridge::set_state (const XMLNode& node)
+{
+	const XMLProperty* prop;
+	XMLNode* geometry;
+
+	m_width = default_width;
+	m_height = default_height;
+	m_root_x = 1;
+	m_root_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) {
+			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 ();
+
+	if ((prop = node.property ("show-meterbridge"))) {
+		if (string_is_affirmative (prop->value())) {
+		       _visible = true;
+		}
+	}
+
+	return 0;
+}
+
+XMLNode&
+Meterbridge::get_state (void)
+{
+	char buf[32];
+	XMLNode* node = new XMLNode ("Meterbridge");
+
+	if (is_realized() && _visible) {
+		get_window_pos_and_size ();
+	}
+
+	XMLNode* geometry = new XMLNode ("geometry");
+	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));
+	node->add_child_nocopy (*geometry);
+
+	node->add_property ("show-meterbridge", _visible ? "yes" : "no");
+	return *node;
+}
+
+
+gint
+Meterbridge::start_updating ()
+{
+	fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun(*this, &Meterbridge::fast_update_strips));
+	return 0;
+}
+
+gint
+Meterbridge::stop_updating ()
+{
+	fast_screen_update_connection.disconnect();
+	return 0;
+}
+
+void
+Meterbridge::fast_update_strips ()
+{
+	if (!is_mapped () || !_session) {
+		return;
+	}
+	for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) {
+		if (!(*i).visible) continue;
+		(*i).s->fast_update ();
+	}
+}
+
+void
+Meterbridge::add_strips (RouteList& routes)
+{
+	MeterStrip* strip;
+	for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
+		boost::shared_ptr<Route> route = (*x);
+		if (route->is_auditioner()) {
+			continue;
+		}
+		if (route->is_monitor()) {
+			continue;
+		}
+
+		strip = new MeterStrip (_session, route);
+		strips.push_back (MeterBridgeStrip(strip));
+		route->active_changed.connect (*this, invalidator (*this), boost::bind (&Meterbridge::resync_order, this), gui_context ());
+
+		meterarea.pack_start (*strip, false, false);
+		strip->show();
+	}
+
+	resync_order();
+}
+
+void
+Meterbridge::remove_strip (MeterStrip* strip)
+{
+	if (_session && _session->deletion_in_progress()) {
+		return;
+	}
+
+	list<MeterBridgeStrip>::iterator i;
+	for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) {
+		if ( (*i).s == strip) {
+			strips.erase (i);
+			break;
+		}
+	}
+
+	resync_order();
+}
+
+void
+Meterbridge::sync_order_keys (RouteSortOrderKey)
+{
+	Glib::Threads::Mutex::Lock lm (_resync_mutex);
+
+	MeterOrderRouteSorter sorter;
+	strips.sort(sorter);
+
+	int pos = 0;
+	int vis = 0;
+	MeterStrip * last = 0;
+
+	unsigned int metrics = 0;
+	MeterType lmt = MeterPeak;
+	bool have_midi = false;
+	metrics_left.set_metric_mode(1, lmt);
+
+	for (list<MeterBridgeStrip>::iterator i = strips.begin(); i != strips.end(); ++i) {
+
+		if (! (*i).s->route()->active()) {
+			(*i).s->hide();
+			(*i).visible = false;
+		}
+		else if ((*i).s->route()->is_master()) {
+			if (_show_master) {
+				(*i).s->show();
+				(*i).visible = true;
+				vis++;
+			} else {
+				(*i).s->hide();
+				(*i).visible = false;
+			}
+		}
+		else if (boost::dynamic_pointer_cast<AudioTrack>((*i).s->route()) == 0
+				&& boost::dynamic_pointer_cast<MidiTrack>((*i).s->route()) == 0
+				) {
+			/* non-master bus */
+			if (_show_busses) {
+				(*i).s->show();
+				(*i).visible = true;
+				vis++;
+			} else {
+				(*i).s->hide();
+				(*i).visible = false;
+			}
+		}
+		else if (boost::dynamic_pointer_cast<MidiTrack>((*i).s->route())) {
+			if (_show_midi) {
+				(*i).s->show();
+				(*i).visible = true;
+				vis++;
+			} else {
+				(*i).s->hide();
+				(*i).visible = false;
+			}
+		}
+		else {
+			(*i).s->show();
+			(*i).visible = true;
+				vis++;
+		}
+
+		(*i).s->set_tick_bar(0);
+
+		MeterType nmt = (*i).s->meter_type();
+		if (nmt == MeterKrms) nmt = MeterPeak; // identical metrics
+		if (pos == 0) {
+			(*i).s->set_tick_bar(1);
+		}
+
+		if ((*i).visible && nmt != lmt && pos == 0) {
+			lmt = nmt;
+			metrics_left.set_metric_mode(1, lmt);
+		} else if ((*i).visible && nmt != lmt) {
+
+			if (last) {
+				last->set_tick_bar(last->get_tick_bar() | 2);
+			}
+			(*i).s->set_tick_bar((*i).s->get_tick_bar() | 1);
+
+			if (_metrics.size() <= metrics) {
+				_metrics.push_back(new MeterStrip(have_midi ? 2 : 3, lmt));
+				meterarea.pack_start (*_metrics[metrics], false, false);
+				_metrics[metrics]->set_session(_session);
+				_metrics[metrics]->show();
+			} else {
+				_metrics[metrics]->set_metric_mode(have_midi ? 2 : 3, lmt);
+			}
+			meterarea.reorder_child(*_metrics[metrics], pos++);
+			metrics++;
+
+			lmt = nmt;
+
+			if (_metrics.size() <= metrics) {
+				_metrics.push_back(new MeterStrip(1, lmt));
+				meterarea.pack_start (*_metrics[metrics], false, false);
+				_metrics[metrics]->set_session(_session);
+				_metrics[metrics]->show();
+			} else {
+				_metrics[metrics]->set_metric_mode(1, lmt);
+			}
+			meterarea.reorder_child(*_metrics[metrics], pos++);
+			metrics++;
+			have_midi = false;
+		}
+
+		if ((*i).visible && (*i).s->has_midi()) {
+			have_midi = true;
+		}
+
+		meterarea.reorder_child(*((*i).s), pos++);
+		if ((*i).visible) {
+			last = (*i).s;
+		}
+	}
+
+	if (last) {
+		last->set_tick_bar(last->get_tick_bar() | 2);
+	}
+
+	metrics_right.set_metric_mode(have_midi ? 2 : 3, lmt);
+
+	while (_metrics.size() > metrics) {
+		meterarea.remove(*_metrics.back());
+		delete (_metrics.back());
+		_metrics.pop_back();
+	}
+
+	_mm_left = metrics_left.get_metric_mode();
+	_mt_left = metrics_left.meter_type();
+	_mm_right = metrics_right.get_metric_mode();
+	_mt_right = metrics_right.meter_type();
+
+	on_scroll();
+	queue_resize();
+}
+
+void
+Meterbridge::resync_order()
+{
+	sync_order_keys(MixerSort);
+}
+
+void
+Meterbridge::parameter_changed (std::string const & p)
+{
+	if (p == "show-busses-on-meterbridge") {
+		_show_busses = _session->config.get_show_busses_on_meterbridge();
+		resync_order();
+	}
+	else if (p == "show-master-on-meterbridge") {
+		_show_master = _session->config.get_show_master_on_meterbridge();
+		resync_order();
+	}
+	else if (p == "show-midi-on-meterbridge") {
+		_show_midi = _session->config.get_show_midi_on_meterbridge();
+		resync_order();
+	}
+	else if (p == "meter-line-up-level") {
+		meter_clear_pattern_cache();
+	}
+	else if (p == "show-rec-on-meterbridge") {
+		scroller.queue_resize();
+	}
+	else if (p == "show-mute-on-meterbridge") {
+		scroller.queue_resize();
+	}
+	else if (p == "show-solo-on-meterbridge") {
+		scroller.queue_resize();
+	}
+	else if (p == "show-name-on-meterbridge") {
+		scroller.queue_resize();
+	}
+	else if (p == "meterbridge-label-height") {
+		scroller.queue_resize();
+	}
+}
+
+void
+Meterbridge::on_theme_changed ()
+{
+	meter_clear_pattern_cache();
+}
diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h
new file mode 100644
index 0000000..2fac91c
--- /dev/null
+++ b/gtk2_ardour/meterbridge.h
@@ -0,0 +1,158 @@
+/*
+    Copyright (C) 2012 Paul Davis
+    Author: 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+#ifndef __ardour_meterbridge_h__
+#define __ardour_meterbridge_h__
+
+#include <glibmm/thread.h>
+
+#include <gtkmm/box.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/label.h>
+#include <gtkmm/window.h>
+
+#include "ardour/ardour.h"
+#include "ardour/types.h"
+#include "ardour/session_handle.h"
+
+#include "pbd/stateful.h"
+#include "pbd/signals.h"
+
+#include "gtkmm2ext/visibility_tracker.h"
+
+#include "meter_strip.h"
+
+class Meterbridge :
+	public Gtk::Window,
+	public PBD::ScopedConnectionList,
+	public ARDOUR::SessionHandlePtr,
+	public Gtkmm2ext::VisibilityTracker
+{
+  public:
+	static Meterbridge* instance();
+	~Meterbridge();
+
+	void set_session (ARDOUR::Session *);
+
+	XMLNode& get_state (void);
+	int set_state (const XMLNode& );
+
+	void show_window ();
+	bool hide_window (GdkEventAny *ev);
+
+  private:
+	Meterbridge ();
+	static Meterbridge* _instance;
+
+	bool _visible;
+	bool _show_busses;
+	bool _show_master;
+	bool _show_midi;
+
+	Gtk::ScrolledWindow scroller;
+	Gtk::HBox meterarea;
+	Gtk::HBox global_hpacker;
+	Gtk::VBox global_vpacker;
+
+	gint start_updating ();
+	gint stop_updating ();
+
+	sigc::connection fast_screen_update_connection;
+	void fast_update_strips ();
+
+	void add_strips (ARDOUR::RouteList&);
+	void remove_strip (MeterStrip *);
+
+	void session_going_away ();
+	void sync_order_keys (ARDOUR::RouteSortOrderKey src);
+	void resync_order ();
+	mutable Glib::Threads::Mutex _resync_mutex;
+
+	struct MeterBridgeStrip {
+		MeterStrip *s;
+		bool visible;
+
+		MeterBridgeStrip(MeterStrip *ss) {
+			s = ss;
+			visible = true;
+		}
+	};
+
+	struct MeterOrderRouteSorter {
+		bool operator() (struct MeterBridgeStrip ma, struct MeterBridgeStrip mb) {
+			boost::shared_ptr<ARDOUR::Route> a = ma.s->route();
+			boost::shared_ptr<ARDOUR::Route> b = mb.s->route();
+			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 (ARDOUR::MixerSort) < b->order_key (ARDOUR::MixerSort);
+		}
+	};
+
+	std::list<MeterBridgeStrip> strips;
+
+	MeterStrip metrics_left;
+	MeterStrip metrics_right;
+	std::vector<MeterStrip *> _metrics;
+
+	Gtk::VBox metrics_vpacker_left;
+	Gtk::VBox metrics_vpacker_right;
+	Gtk::HBox metrics_spacer_left;
+	Gtk::HBox metrics_spacer_right;
+
+	static const int32_t default_width = 600;
+	static const int32_t default_height = 400;
+	static const int max_height = 1200; // == 1024 + 148 + 16 + 12 see meter_strip.cc
+	int cur_max_width;
+
+	void update_title ();
+
+	// 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 scroll_left ();
+	void scroll_right ();
+
+	void on_size_allocate (Gtk::Allocation&);
+	void on_size_request (Gtk::Requisition*);
+
+	void parameter_changed (std::string const & p);
+	void on_theme_changed ();
+
+	void on_scroll ();
+	sigc::connection scroll_connection;
+
+	int _mm_left, _mm_right;
+	ARDOUR::MeterType _mt_left, _mt_right;
+};
+
+#endif
diff --git a/gtk2_ardour/midi_automation_line.cc b/gtk2_ardour/midi_automation_line.cc
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/midi_automation_line.h b/gtk2_ardour/midi_automation_line.h
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc
index 6cdf63f..a4ffc44 100644
--- a/gtk2_ardour/midi_time_axis.cc
+++ b/gtk2_ardour/midi_time_axis.cc
@@ -201,7 +201,7 @@ MidiTimeAxisView::set_route (boost::shared_ptr<Route> rt)
 		v->pack_start (*manage (new Label ("")), true, true);
 		v->show ();
 		h->show ();
-		controls_hbox.pack_start(*v);
+		controls_hbox.pack_start(*v, false, false);
 
 		controls_ebox.set_name ("MidiTrackControlsBaseUnselected");
 		controls_base_selected_name = "MidiTrackControlsBaseSelected";
diff --git a/gtk2_ardour/midi_tracer.cc b/gtk2_ardour/midi_tracer.cc
index 70d7c24..073fd9c 100644
--- a/gtk2_ardour/midi_tracer.cc
+++ b/gtk2_ardour/midi_tracer.cc
@@ -300,7 +300,11 @@ MidiTracer::tracer (Parser&, byte* msg, size_t len)
 			s += snprintf (
 				&buf[s], bufsize, " MTC full frame to %02d:%02d:%02d:%02d\n", msg[5] & 0x1f, msg[6], msg[7], msg[8]
 				);
+		} else if (len == 3 && msg[0] == MIDI::position) {
 
+			/* MIDI Song Position */
+			int midi_beats = (msg[2] << 7) | msg[1];
+			s += snprintf (&buf[s], bufsize, "%16s %d\n", "Position", (int) midi_beats);
 		} else {
 
 			/* other sys-ex */
diff --git a/gtk2_ardour/missing_plugin_dialog.cc b/gtk2_ardour/missing_plugin_dialog.cc
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/missing_plugin_dialog.h b/gtk2_ardour/missing_plugin_dialog.h
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 79d4b22..d77023d 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -62,6 +62,7 @@
 #include "utils.h"
 #include "gui_thread.h"
 #include "route_group_menu.h"
+#include "meter_patterns.h"
 
 #include "i18n.h"
 
@@ -70,6 +71,7 @@ using namespace PBD;
 using namespace Gtk;
 using namespace Gtkmm2ext;
 using namespace std;
+using namespace ArdourMeter;
 
 int MixerStrip::scrollbar_height = 0;
 PBD::Signal1<void,MixerStrip*> MixerStrip::CatchDeletion;
@@ -410,8 +412,10 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
 	if (gpm.gain_display.get_parent()) {
 		gpm.gain_display.get_parent()->remove (gpm.gain_display);
 	}
+
+	gpm.set_type (rt->meter_type());
 	
-	middle_button_table.attach (gpm.gain_display,0,1,1,2);
+	middle_button_table.attach (gpm.gain_display,0,1,1,2, EXPAND|FILL, EXPAND);
 	middle_button_table.attach (gpm.peak_display,1,2,1,2);
 
 	if (solo_button->get_parent()) {
@@ -507,6 +511,8 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
 	route_ops_menu = 0;
 
 	_route->meter_change.connect (route_connections, invalidator (*this), bind (&MixerStrip::meter_changed, this), gui_context());
+	_route->input()->changed.connect (*this, invalidator (*this), boost::bind (&MixerStrip::update_output_display, this), gui_context());
+	_route->output()->changed.connect (*this, invalidator (*this), boost::bind (&MixerStrip::update_output_display, this), gui_context());
 	_route->route_group_changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::route_group_changed, this), gui_context());
 
 	if (_route->panner_shell()) {
@@ -644,6 +650,7 @@ MixerStrip::set_width_enum (Width w, void* owner)
 				gpm.short_astyle_string(gain_automation->automation_style()));
 		gpm.gain_automation_state_button.set_text (
 				gpm.short_astate_string(gain_automation->automation_state()));
+		gain_meter().setup_meters (); // recalc meter width
 
 		if (_route->panner()) {
 			((Gtk::Label*)panners.pan_automation_style_button.get_child())->set_text (
@@ -1568,11 +1575,11 @@ MixerStrip::width_button_pressed (GdkEventButton* ev)
 	if (Keyboard::modifier_state_contains (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier | Keyboard::TertiaryModifier)) && _mixer_owned) {
 		switch (_width) {
 		case Wide:
-			_mixer.set_strip_width (Narrow);
+			_mixer.set_strip_width (Narrow, true);
 			break;
 
 		case Narrow:
-			_mixer.set_strip_width (Wide);
+			_mixer.set_strip_width (Wide, true);
 			break;
 		}
 	} else {
@@ -1665,28 +1672,22 @@ MixerStrip::reset_strip_style ()
 		if (is_midi_track()) {
 			if (_route->active()) {
 				set_name ("MidiTrackStripBase");
-				gpm.set_meter_strip_name ("MidiTrackMetrics");
 			} else {
 				set_name ("MidiTrackStripBaseInactive");
-				gpm.set_meter_strip_name ("MidiTrackMetricsInactive");
 			}
 			gpm.set_fader_name ("MidiTrackFader");
 		} else if (is_audio_track()) {
 			if (_route->active()) {
 				set_name ("AudioTrackStripBase");
-				gpm.set_meter_strip_name ("AudioTrackMetrics");
 			} else {
 				set_name ("AudioTrackStripBaseInactive");
-				gpm.set_meter_strip_name ("AudioTrackMetricsInactive");
 			}
 			gpm.set_fader_name ("AudioTrackFader");
 		} else {
 			if (_route->active()) {
 				set_name ("AudioBusStripBase");
-				gpm.set_meter_strip_name ("AudioBusMetrics");
 			} else {
 				set_name ("AudioBusStripBaseInactive");
-				gpm.set_meter_strip_name ("AudioBusMetricsInactive");
 			}
 			gpm.set_fader_name ("AudioBusFader");
 
@@ -1905,24 +1906,20 @@ MixerStrip::set_button_names ()
 		monitor_disk_button->set_text (_("Disk"));
 
 		if (_route && _route->solo_safe()) {
-			if (solo_safe_pixbuf == 0) {
-				solo_safe_pixbuf = ::get_icon("solo-safe-icon");
-			}
-			solo_button->set_image (solo_safe_pixbuf);
-			solo_button->set_text (string());
+			solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
 		} else {
-			solo_button->set_image (Glib::RefPtr<Gdk::Pixbuf>());
-			if (!Config->get_solo_control_is_listen_control()) {
-				solo_button->set_text (_("Solo"));
-			} else {
-				switch (Config->get_listen_position()) {
-				case AfterFaderListen:
-					solo_button->set_text (_("AFL"));
-					break;
-				case PreFaderListen:
-					solo_button->set_text (_("PFL"));
-					break;
-				}
+			solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
+		}
+		if (!Config->get_solo_control_is_listen_control()) {
+			solo_button->set_text (_("Solo"));
+		} else {
+			switch (Config->get_listen_position()) {
+			case AfterFaderListen:
+				solo_button->set_text (_("AFL"));
+				break;
+			case PreFaderListen:
+				solo_button->set_text (_("PFL"));
+				break;
 			}
 		}
 		solo_isolated_led->set_text (_("iso"));
@@ -1934,28 +1931,25 @@ MixerStrip::set_button_names ()
 		mute_button->set_text (_("M"));
 		monitor_input_button->set_text (_("I"));
 		monitor_disk_button->set_text (_("D"));
+
 		if (_route && _route->solo_safe()) {
-			solo_button->remove ();
-			if (solo_safe_pixbuf == 0) {
-				solo_safe_pixbuf =::get_icon("solo-safe-icon");
-			}
-			solo_button->set_image (solo_safe_pixbuf);
-			solo_button->set_text (string());
+			solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
 		} else {
-			solo_button->set_image (Glib::RefPtr<Gdk::Pixbuf>());
-			if (!Config->get_solo_control_is_listen_control()) {
-				solo_button->set_text (_("S"));
-			} else {
-				switch (Config->get_listen_position()) {
-				case AfterFaderListen:
-					solo_button->set_text (_("A"));
-					break;
-				case PreFaderListen:
-					solo_button->set_text (_("P"));
-					break;
-				}
+			solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
+		}
+		if (!Config->get_solo_control_is_listen_control()) {
+			solo_button->set_text (_("S"));
+		} else {
+			switch (Config->get_listen_position()) {
+			case AfterFaderListen:
+				solo_button->set_text (_("A"));
+				break;
+			case PreFaderListen:
+				solo_button->set_text (_("P"));
+				break;
 			}
 		}
+
 		solo_isolated_led->set_text (_("i"));
 		solo_safe_led->set_text (_("L"));
 		break;
@@ -2129,17 +2123,60 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev)
 
 	RadioMenuItem::Group group;
 
-	add_level_meter_item (items, group, _("Input"), MeterInput);
-	add_level_meter_item (items, group, _("Pre-fader"), MeterPreFader);
-	add_level_meter_item (items, group, _("Post-fader"), MeterPostFader);
-	add_level_meter_item (items, group, _("Output"), MeterOutput);
-	add_level_meter_item (items, group, _("Custom"), MeterCustom);
+	_suspend_menu_callbacks = true;
+	add_level_meter_item_point (items, group, _("Input"), MeterInput);
+	add_level_meter_item_point (items, group, _("Pre-fader"), MeterPreFader);
+	add_level_meter_item_point (items, group, _("Post-fader"), MeterPostFader);
+	add_level_meter_item_point (items, group, _("Output"), MeterOutput);
+	add_level_meter_item_point (items, group, _("Custom"), MeterCustom);
+
+	RadioMenuItem::Group tgroup;
+	items.push_back (SeparatorElem());
+
+	add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak);
+	add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms),  MeterKrms);
+	add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN);
+	add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR);
+	add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC);
+	add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU);
+	add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK20), MeterK20);
+	add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK14), MeterK14);
+	add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU),  MeterVU);
+
+	int _strip_type;
+	if (_route->is_master()) {
+		_strip_type = 4;
+	}
+	else if (boost::dynamic_pointer_cast<AudioTrack>(_route) == 0
+			&& boost::dynamic_pointer_cast<MidiTrack>(_route) == 0) {
+		/* non-master bus */
+		_strip_type = 3;
+	}
+	else if (boost::dynamic_pointer_cast<MidiTrack>(_route)) {
+		_strip_type = 2;
+	}
+	else {
+		_strip_type = 1;
+	}
+
+	MeterType cmt = _route->meter_type();
+	const std::string cmn = ArdourMeter::meter_type_string(cmt);
+
+	items.push_back (SeparatorElem());
+	items.push_back (MenuElem (string_compose(_("Change all in Group to %1"), cmn),
+				sigc::bind (SetMeterTypeMulti, -1, _route->route_group(), cmt)));
+	items.push_back (MenuElem (string_compose(_("Change all to %1"), cmn),
+				sigc::bind (SetMeterTypeMulti, 0, _route->route_group(), cmt)));
+	items.push_back (MenuElem (string_compose(_("Change same track-type to %1"), cmn),
+				sigc::bind (SetMeterTypeMulti, _strip_type, _route->route_group(), cmt)));
 
 	m->popup (ev->button, ev->time);
+	_suspend_menu_callbacks = false;
 }
 
 void
-MixerStrip::add_level_meter_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterPoint point)
+MixerStrip::add_level_meter_item_point (Menu_Helpers::MenuList& items,
+		RadioMenuItem::Group& group, string const & name, MeterPoint point)
 {
 	using namespace Menu_Helpers;
 	
@@ -2151,5 +2188,24 @@ MixerStrip::add_level_meter_item (Menu_Helpers::MenuList& items, RadioMenuItem::
 void
 MixerStrip::set_meter_point (MeterPoint p)
 {
+	if (_suspend_menu_callbacks) return;
 	_route->set_meter_point (p);
 }
+
+void
+MixerStrip::add_level_meter_item_type (Menu_Helpers::MenuList& items,
+		RadioMenuItem::Group& group, string const & name, MeterType type)
+{
+	using namespace Menu_Helpers;
+	
+	items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (*this, &MixerStrip::set_meter_type), type)));
+	RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ());
+	i->set_active (_route->meter_type() == type);
+}
+
+void
+MixerStrip::set_meter_type (MeterType t)
+{
+	if (_suspend_menu_callbacks) return;
+	gpm.set_type (t);
+}
diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h
index 4a2865c..fe10070 100644
--- a/gtk2_ardour/mixer_strip.h
+++ b/gtk2_ardour/mixer_strip.h
@@ -308,10 +308,13 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
 	void add_input_port (ARDOUR::DataType);
 	void add_output_port (ARDOUR::DataType);
 
+	bool _suspend_menu_callbacks;
 	bool level_meter_button_press (GdkEventButton *);
 	void popup_level_meter_menu (GdkEventButton *);
-	void add_level_meter_item (Gtk::Menu_Helpers::MenuList &, Gtk::RadioMenuItem::Group &, std::string const &, ARDOUR::MeterPoint);
+	void add_level_meter_item_point (Gtk::Menu_Helpers::MenuList &, Gtk::RadioMenuItem::Group &, std::string const &, ARDOUR::MeterPoint);
+	void add_level_meter_item_type (Gtk::Menu_Helpers::MenuList &, Gtk::RadioMenuItem::Group &, std::string const &, ARDOUR::MeterType);
 	void set_meter_point (ARDOUR::MeterPoint);
+	void set_meter_type (ARDOUR::MeterType);
 	PBD::ScopedConnection _level_meter_connection;
 
 	std::string meter_point_string (ARDOUR::MeterPoint);
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index e3a97da..7e8188c 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -1477,12 +1477,12 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev)
 }
 
 void
-Mixer_UI::set_strip_width (Width w)
+Mixer_UI::set_strip_width (Width w, bool save)
 {
 	_strip_width = w;
 
 	for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
-		(*i)->set_width_enum (w, this);
+		(*i)->set_width_enum (w, save ? (*i)->width_owner() : this);
 	}
 }
 
@@ -1666,6 +1666,7 @@ Mixer_UI::pane_allocation_handler (Allocation&, Gtk::Paned* which)
 void
 Mixer_UI::scroll_left ()
 {
+	if (!scroller.get_hscrollbar()) return;
 	Adjustment* adj = scroller.get_hscrollbar()->get_adjustment();
 	/* stupid GTK: can't rely on clamping across versions */
 	scroller.get_hscrollbar()->set_value (max (adj->get_lower(), adj->get_value() - adj->get_step_increment()));
@@ -1674,6 +1675,7 @@ Mixer_UI::scroll_left ()
 void
 Mixer_UI::scroll_right ()
 {
+	if (!scroller.get_hscrollbar()) return;
 	Adjustment* adj = scroller.get_hscrollbar()->get_adjustment();
 	/* stupid GTK: can't rely on clamping across versions */
 	scroller.get_hscrollbar()->set_value (min (adj->get_upper(), adj->get_value() + adj->get_step_increment()));
@@ -1924,7 +1926,7 @@ void
 Mixer_UI::toggle_midi_input_active (bool flip_others)
 {
 	boost::shared_ptr<RouteList> rl (new RouteList);
-	bool onoff;
+	bool onoff = false;
 
 	set_route_targets_for_operation ();
 
diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h
index 8a293f7..4f1c682 100644
--- a/gtk2_ardour/mixer_ui.h
+++ b/gtk2_ardour/mixer_ui.h
@@ -66,7 +66,7 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
 
 	PluginSelector* plugin_selector();
 
-	void  set_strip_width (Width);
+	void  set_strip_width (Width, bool save = false);
 	Width get_strip_width () const { return _strip_width; }
 
 	void unselect_strip_in_display (MixerStrip*);
diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h
index d39abfa..2073da5 100644
--- a/gtk2_ardour/option_editor.h
+++ b/gtk2_ardour/option_editor.h
@@ -308,9 +308,34 @@ public:
 		_label = manage (new Gtk::Label (n + ":"));
 		_label->set_alignment (0, 0.5);
 		_hscale = manage (new Gtk::HScale(adj));
+		_adj = NULL;
 	}
 
-	void set_state_from_config () { }
+	HSliderOption (
+		std::string const & i,
+		std::string const & n,
+		Gtk::Adjustment *adj,
+		sigc::slot<float> g,
+		sigc::slot<bool, float> s
+		)
+		: Option (i, n)
+		, _get (g)
+		, _set (s)
+		, _adj (adj)
+	{
+		_label = manage (new Gtk::Label (n + ":"));
+		_label->set_alignment (0, 0.5);
+		_hscale = manage (new Gtk::HScale(*_adj));
+		_adj->signal_value_changed().connect (sigc::mem_fun (*this, &HSliderOption::changed));
+	}
+
+	void set_state_from_config () {
+		if (_adj) _adj->set_value (_get());
+	}
+
+	void changed () {
+		if (_adj) _set (_adj->get_value ());
+	}
 
 	void add_to_page (OptionEditorPage* p)
 	{
@@ -324,8 +349,11 @@ public:
 	Gtk::Widget& tip_widget() { return *_hscale; }
 
 private:
+	sigc::slot<float> _get;
+	sigc::slot<bool, float> _set;
 	Gtk::Label* _label;
 	Gtk::HScale* _hscale;
+	Gtk::Adjustment* _adj;
 };
 
 /** Component which provides the UI to handle an enumerated option using a GTK ComboBox.
diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc
index 943a7a8..d9741f5 100644
--- a/gtk2_ardour/plugin_ui.cc
+++ b/gtk2_ardour/plugin_ui.cc
@@ -148,7 +148,6 @@ PluginUIWindow::PluginUIWindow (
 	set_name ("PluginEditor");
 	add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
 
-	signal_delete_event().connect (sigc::bind (sigc::ptr_fun (just_hide_it), reinterpret_cast<Window*> (this)), false);
 	insert->DropReferences.connect (death_connection, invalidator (*this), boost::bind (&PluginUIWindow::plugin_going_away, this), gui_context());
 
 	gint h = _pluginui->get_preferred_height ();
@@ -565,9 +564,14 @@ PlugUIBase::preset_selected ()
 	}
 }
 
+#ifdef NO_PLUGIN_STATE
+static bool seen_saving_message = false;
+#endif
+
 void
 PlugUIBase::add_plugin_setting ()
 {
+#ifndef NO_PLUGIN_STATE
 	NewPluginPresetDialog d (plugin);
 
 	switch (d.run ()) {
@@ -586,23 +590,49 @@ PlugUIBase::add_plugin_setting ()
 		}
 		break;
 	}
+#else 
+	if (!seen_saving_message) {
+		info << string_compose (_("Plugin presets are not supported in this build of %1. Consider paying for a full version"),
+					PROGRAM_NAME)
+		     << endmsg;
+		seen_saving_message = true;
+	}
+#endif
 }
 
 void
 PlugUIBase::save_plugin_setting ()
 {
+#ifndef NO_PLUGIN_STATE
 	string const name = _preset_combo.get_active_text ();
 	plugin->remove_preset (name);
 	Plugin::PresetRecord const r = plugin->save_preset (name);
 	if (!r.uri.empty ()) {
 		plugin->load_preset (r);
 	}
+#else 
+	if (!seen_saving_message) {
+		info << string_compose (_("Plugin presets are not supported in this build of %1. Consider paying for a newer version"),
+					PROGRAM_NAME)
+		     << endmsg;
+		seen_saving_message = true;
+	}
+#endif
 }
 
 void
 PlugUIBase::delete_plugin_setting ()
 {
+#ifndef NO_PLUGIN_STATE
 	plugin->remove_preset (_preset_combo.get_active_text ());
+#else
+	if (!seen_saving_message) {
+		info << string_compose (_("Plugin presets are not supported in this build of %1. Consider paying for a newer version"),
+					PROGRAM_NAME)
+		     << endmsg;
+		seen_saving_message = true;
+	}
+#endif
 }
 
 bool
diff --git a/gtk2_ardour/po/de.po b/gtk2_ardour/po/de.po
index 632efab..c9efd56 100644
--- a/gtk2_ardour/po/de.po
+++ b/gtk2_ardour/po/de.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtk-ardour 0.347.2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-06-11 08:49-0400\n"
-"PO-Revision-Date: 2013-03-05 12:38+0100\n"
+"POT-Creation-Date: 2013-07-28 12:10+0200\n"
+"PO-Revision-Date: 2013-07-28 15:37+0200\n"
 "Last-Translator: Edgar Aichinger <edogawa at aon.at>\n"
 "Language-Team: German <ardour-dev at lists.ardour.org>\n"
 "Language: de\n"
@@ -412,7 +412,7 @@ msgstr "Konnte die %1 Menü-Definitionsdatei nicht finden"
 msgid "%1 will not work without a valid ardour.menus file"
 msgstr "%1 benötigt eine gültige ardour.menus Datei"
 
-#: add_route_dialog.cc:53 route_params_ui.cc:503
+#: add_route_dialog.cc:53 route_params_ui.cc:500
 msgid "Add Track or Bus"
 msgstr "Spur/Bus hinzufügen"
 
@@ -448,8 +448,8 @@ msgstr "Audiobusse"
 msgid "Add:"
 msgstr "Erstelle:"
 
-#: add_route_dialog.cc:114 startup.cc:833 time_fx_dialog.cc:91
-#: add_video_dialog.cc:149 video_server_dialog.cc:109
+#: add_route_dialog.cc:114 startup.cc:841 time_fx_dialog.cc:91
+#: add_video_dialog.cc:149 video_server_dialog.cc:111
 msgid "<b>Options</b>"
 msgstr "<b>Optionen</b>"
 
@@ -504,7 +504,7 @@ msgstr ""
 "stattdessen eine normale Audio- oder MIDI-Spur"
 
 #: add_route_dialog.cc:319 add_route_dialog.cc:338 editor_actions.cc:385
-#: editor_rulers.cc:377 time_axis_view.cc:1301
+#: editor_rulers.cc:377 time_axis_view.cc:1305
 msgid "Normal"
 msgstr "Normal"
 
@@ -548,7 +548,7 @@ msgstr "8 Kanäle"
 msgid "12 Channel"
 msgstr "12 Kanäle"
 
-#: add_route_dialog.cc:475 mixer_strip.cc:2136
+#: add_route_dialog.cc:475 mixer_strip.cc:2131
 msgid "Custom"
 msgstr "Benutzerdefiniert"
 
@@ -636,7 +636,7 @@ msgid "Track"
 msgstr "Spur"
 
 #: analysis_window.cc:68 editor_actions.cc:616 mixer_ui.cc:125
-#: mixer_ui.cc:1793
+#: mixer_ui.cc:1795
 msgid "Show"
 msgstr "Anzeigen"
 
@@ -644,96 +644,93 @@ msgstr "Anzeigen"
 msgid "Re-analyze data"
 msgstr "Daten erneut analysieren"
 
-#: ardour_button.cc:658
+#: ardour_button.cc:704
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr ""
 "Schaltfläche kann den Status des nichtexistenten Kontrollzieles nicht "
 "verfolgen\n"
 
-#: ardour_ui.cc:179
+#: ardour_ui.cc:180
 msgid "audition"
 msgstr "Vorhören"
 
-#: ardour_ui.cc:180
+#: ardour_ui.cc:181
 msgid "solo"
 msgstr "Solo"
 
-#: ardour_ui.cc:181
+#: ardour_ui.cc:182
 msgid "feedback"
 msgstr "Feedback"
 
-#: ardour_ui.cc:183 speaker_dialog.cc:36
+#: ardour_ui.cc:186 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr "Lautsprechereinstellung"
 
-#: ardour_ui.cc:184 theme_manager.cc:56 theme_manager.cc:64
+#: ardour_ui.cc:187 theme_manager.cc:56 theme_manager.cc:64
 msgid "Theme Manager"
 msgstr "Thema"
 
-#: ardour_ui.cc:185 keyeditor.cc:53
+#: ardour_ui.cc:188 keyeditor.cc:53
 msgid "Key Bindings"
 msgstr "Tastenkombinationen"
 
-#: ardour_ui.cc:186
+#: ardour_ui.cc:189
 msgid "Preferences"
 msgstr "Globale Einstellungen"
 
-#: ardour_ui.cc:187 ardour_ui.cc:192
-#, fuzzy
+#: ardour_ui.cc:190 ardour_ui.cc:195
 msgid "Add Tracks/Busses"
-msgstr "Spuren/Busse"
+msgstr "Spuren/Busse hinzufügen"
 
-#: ardour_ui.cc:188
+#: ardour_ui.cc:191
 msgid "About"
 msgstr "Über..."
 
-#: ardour_ui.cc:189 location_ui.cc:1134
+#: ardour_ui.cc:192 location_ui.cc:1146
 msgid "Locations"
 msgstr "Positionen"
 
-#: ardour_ui.cc:190 route_params_ui.cc:57 route_params_ui.cc:604
+#: ardour_ui.cc:193 route_params_ui.cc:58 route_params_ui.cc:606
 msgid "Tracks and Busses"
 msgstr "Spuren/Busse"
 
-#: ardour_ui.cc:191
+#: ardour_ui.cc:194
 msgid "Properties"
 msgstr "Projekteinstellungen"
 
-#: ardour_ui.cc:193 bundle_manager.cc:263
+#: ardour_ui.cc:196 bundle_manager.cc:263
 msgid "Bundle Manager"
 msgstr "Bundle Manager"
 
-#: ardour_ui.cc:194 big_clock_window.cc:35
+#: ardour_ui.cc:197 big_clock_window.cc:35
 msgid "Big Clock"
 msgstr "Große Zeitanzeige"
 
-#: ardour_ui.cc:195
-#, fuzzy
+#: ardour_ui.cc:198
 msgid "Audio Connections"
-msgstr "Audio Verbindungsmanager"
+msgstr "Audio-Verbindungen"
 
-#: ardour_ui.cc:196
-#, fuzzy
+#: ardour_ui.cc:199
 msgid "MIDI Connections"
-msgstr "Midi Verbindungsmanager"
+msgstr "MIDI-Verbindungen"
 
-#: ardour_ui.cc:198
+#: ardour_ui.cc:201
 msgid "Errors"
 msgstr "Fehlermeldungen"
 
-#: ardour_ui.cc:299
+#: ardour_ui.cc:303
 msgid "could not initialize %1."
 msgstr "Konnte %1 nicht initialisieren."
 
-#: ardour_ui.cc:394
+#: ardour_ui.cc:398
 msgid "Starting audio engine"
 msgstr "Starte Audio-Engine"
 
-#: ardour_ui.cc:763 startup.cc:638
+#: ardour_ui.cc:768 startup.cc:638
 msgid "%1 is ready for use"
 msgstr "%1 ist bereit"
 
-#: ardour_ui.cc:811
+#: ardour_ui.cc:816
 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"
@@ -748,23 +745,23 @@ msgstr ""
 "Sie können die Speicherbegrenzung mit 'ulimit -l' einsehen und normalerweise "
 "in %2 verändern."
 
-#: ardour_ui.cc:828
+#: ardour_ui.cc:833
 msgid "Do not show this window again"
 msgstr "Diese Meldung nicht erneut anzeigen"
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:875
 msgid "Don't quit"
 msgstr "Abbrechen"
 
-#: ardour_ui.cc:871
+#: ardour_ui.cc:876
 msgid "Just quit"
 msgstr "Beenden ohne zu speichern"
 
-#: ardour_ui.cc:872
+#: ardour_ui.cc:877
 msgid "Save and quit"
 msgstr "Speichern und beenden"
 
-#: ardour_ui.cc:882
+#: ardour_ui.cc:887
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -778,15 +775,15 @@ msgstr ""
 "\n"
 "\"Trotzdem beenden\"."
 
-#: ardour_ui.cc:913
+#: ardour_ui.cc:918
 msgid "Please wait while %1 cleans up..."
 msgstr "Bitte warten Sie, während %1 aufräumt."
 
-#: ardour_ui.cc:930
+#: ardour_ui.cc:935
 msgid "Unsaved Session"
 msgstr "Nicht gespeichertes Projekt"
 
-#: ardour_ui.cc:951
+#: ardour_ui.cc:956
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -804,7 +801,7 @@ msgstr ""
 "\n"
 "Wie wollen Sie vorgehen?"
 
-#: ardour_ui.cc:954
+#: ardour_ui.cc:959
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -822,74 +819,74 @@ msgstr ""
 "\n"
 "Wie wollen Sie vorgehen?"
 
-#: ardour_ui.cc:968
+#: ardour_ui.cc:973
 msgid "Prompter"
 msgstr "Frage"
 
-#: ardour_ui.cc:1045
+#: ardour_ui.cc:1053
 msgid "disconnected"
 msgstr "getrennt"
 
-#: ardour_ui.cc:1052
+#: ardour_ui.cc:1060
 #, c-format
 msgid "JACK: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr "JACK: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1056
+#: ardour_ui.cc:1064
 #, c-format
 msgid "JACK: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr "JACK: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1074 export_video_dialog.cc:67
+#: ardour_ui.cc:1082 export_video_dialog.cc:67
 msgid "File:"
 msgstr "Datei:"
 
-#: ardour_ui.cc:1078
+#: ardour_ui.cc:1086
 msgid "BWF"
 msgstr "BWF"
 
-#: ardour_ui.cc:1081
+#: ardour_ui.cc:1089
 msgid "WAV"
 msgstr "WAV"
 
-#: ardour_ui.cc:1084
+#: ardour_ui.cc:1092
 msgid "WAV64"
 msgstr "WAV64"
 
-#: ardour_ui.cc:1087 session_option_editor.cc:197
+#: ardour_ui.cc:1095 session_option_editor.cc:197
 msgid "CAF"
 msgstr "CAF"
 
-#: ardour_ui.cc:1090
+#: ardour_ui.cc:1098
 msgid "AIFF"
 msgstr "AIFF"
 
-#: ardour_ui.cc:1093
+#: ardour_ui.cc:1101
 msgid "iXML"
 msgstr "iXML"
 
-#: ardour_ui.cc:1096
+#: ardour_ui.cc:1104
 msgid "RF64"
 msgstr "RF64"
 
-#: ardour_ui.cc:1104
+#: ardour_ui.cc:1112
 msgid "32-float"
 msgstr "32-float"
 
-#: ardour_ui.cc:1107
+#: ardour_ui.cc:1115
 msgid "24-int"
 msgstr "24-int"
 
-#: ardour_ui.cc:1110
+#: ardour_ui.cc:1118
 msgid "16-int"
 msgstr "16-int"
 
-#: ardour_ui.cc:1129
+#: ardour_ui.cc:1137
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 
-#: ardour_ui.cc:1148
+#: ardour_ui.cc:1156
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -900,33 +897,33 @@ msgstr ""
 "%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
 "%<PRIu32>%%</span>"
 
-#: ardour_ui.cc:1184
+#: ardour_ui.cc:1192
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr "Disk: <span foreground=\"green\">Unbekannt</span>"
 
-#: ardour_ui.cc:1186
+#: ardour_ui.cc:1194
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr "Disk: <span foreground=\"green\">24h+</span>"
 
-#: ardour_ui.cc:1204
+#: ardour_ui.cc:1212
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr "Disk: <span foreground=\"green\">>24 h</span>"
 
-#: ardour_ui.cc:1215
+#: ardour_ui.cc:1223
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 
-#: ardour_ui.cc:1241
+#: ardour_ui.cc:1249
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr "Timecode|TC: <span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1358 ardour_ui.cc:1367 startup.cc:1045
+#: ardour_ui.cc:1366 ardour_ui.cc:1375 startup.cc:1054
 msgid "Recent Sessions"
 msgstr "Zuletzt verwendete Projekte"
 
-#: ardour_ui.cc:1447
+#: ardour_ui.cc:1455
 msgid ""
 "%1 is not connected to JACK\n"
 "You cannot open or close sessions in this condition"
@@ -934,27 +931,27 @@ msgstr ""
 "%1 ist derzeit nicht mit JACK verbunden.\n"
 "Dadurch können keine Projekte geöffnet oder geschlossen werden."
 
-#: ardour_ui.cc:1474
+#: ardour_ui.cc:1482
 msgid "Open Session"
 msgstr "Projekt öffnen"
 
-#: ardour_ui.cc:1492 session_import_dialog.cc:169
-#: session_metadata_dialog.cc:729 startup.cc:1074
+#: ardour_ui.cc:1507 session_import_dialog.cc:169
+#: session_metadata_dialog.cc:729 startup.cc:1083
 msgid "%1 sessions"
 msgstr "%1 Projekte"
 
-#: ardour_ui.cc:1529
+#: ardour_ui.cc:1544
 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:1537
+#: ardour_ui.cc:1552
 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:1543 ardour_ui.cc:1604
+#: ardour_ui.cc:1558 ardour_ui.cc:1619
 msgid ""
 "There are insufficient JACK ports available\n"
 "to create a new track or bus.\n"
@@ -967,24 +964,24 @@ msgstr ""
 "%1 und starten Sie JACK mit einer größeren\n"
 "Anzahl Ports neu."
 
-#: ardour_ui.cc:1578
+#: ardour_ui.cc:1593
 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:1587
+#: ardour_ui.cc:1602
 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:1596
+#: ardour_ui.cc:1611
 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:1713
+#: ardour_ui.cc:1728
 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."
@@ -993,7 +990,7 @@ msgstr ""
 "eine oder mehrere Spur hinzu. Die geht über \"Spur/Bus hinzufügen\"\n"
 "im Menüpunkt Projekt."
 
-#: ardour_ui.cc:2103
+#: ardour_ui.cc:2118
 msgid ""
 "The audio backend (JACK) was shutdown because:\n"
 "\n"
@@ -1003,7 +1000,7 @@ msgstr ""
 "\n"
 "%1"
 
-#: ardour_ui.cc:2105
+#: ardour_ui.cc:2120
 msgid ""
 "JACK has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -1015,19 +1012,19 @@ msgstr ""
 "war. Sie sollten versuchen, JACK neu zu starten,\n"
 "neu zu verbinden, und das Projekt zu speichern."
 
-#: ardour_ui.cc:2131
+#: ardour_ui.cc:2146
 msgid "Unable to start the session running"
 msgstr "Konnte das aktuelle Projekt nicht starten"
 
-#: ardour_ui.cc:2211
+#: ardour_ui.cc:2226
 msgid "Take Snapshot"
 msgstr "Schnappschuss machen"
 
-#: ardour_ui.cc:2212
+#: ardour_ui.cc:2227
 msgid "Name of new snapshot"
 msgstr "Name für neuen Schnappschuss"
 
-#: ardour_ui.cc:2236
+#: ardour_ui.cc:2251
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
@@ -1035,29 +1032,29 @@ 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:2248
+#: ardour_ui.cc:2263
 msgid "Confirm Snapshot Overwrite"
 msgstr "Bestätige das Überschreiben des Schnappschusses"
 
-#: ardour_ui.cc:2249
+#: ardour_ui.cc:2264
 msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
 msgstr ""
 "Ein Schnappschuss mit diesem Namen existiert bereits. Wollen Sie ihn "
 "überschreiben?"
 
-#: ardour_ui.cc:2252 utils_videotl.cc:66
+#: ardour_ui.cc:2267 utils_videotl.cc:66
 msgid "Overwrite"
 msgstr "Überschreiben"
 
-#: ardour_ui.cc:2286
+#: ardour_ui.cc:2301
 msgid "Rename Session"
 msgstr "Projekt umbenennen"
 
-#: ardour_ui.cc:2287
+#: ardour_ui.cc:2302
 msgid "New session name"
 msgstr "Neuer Projektname"
 
-#: ardour_ui.cc:2301 ardour_ui.cc:2681 ardour_ui.cc:2726
+#: ardour_ui.cc:2316 ardour_ui.cc:2696 ardour_ui.cc:2741
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
@@ -1065,14 +1062,14 @@ msgstr ""
 "Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n"
 "dürfen Projektnamen kein '%1'-Zeichen enthalten"
 
-#: ardour_ui.cc:2309
+#: ardour_ui.cc:2324
 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:2318
+#: ardour_ui.cc:2333
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
@@ -1080,19 +1077,19 @@ msgstr ""
 "Das Umbenennen des Projekts ist fehlgeschlagen.\n"
 "Dies könnte auf schwerwiegende Probleme hinweisen."
 
-#: ardour_ui.cc:2429
+#: ardour_ui.cc:2444
 msgid "Save Template"
 msgstr "Als Vorlage Speichern"
 
-#: ardour_ui.cc:2430
+#: ardour_ui.cc:2445
 msgid "Name for template:"
 msgstr "Name für Vorlage"
 
-#: ardour_ui.cc:2431
+#: ardour_ui.cc:2446
 msgid "-template"
 msgstr "-Vorlage"
 
-#: ardour_ui.cc:2469
+#: ardour_ui.cc:2484
 msgid ""
 "This session\n"
 "%1\n"
@@ -1102,52 +1099,52 @@ msgstr ""
 "%1\n"
 "existiert bereits. Wollen Sie sie öffnen?"
 
-#: ardour_ui.cc:2479
+#: ardour_ui.cc:2494
 msgid "Open Existing Session"
 msgstr "Vorhandenes Projekt öffnen"
 
-#: ardour_ui.cc:2717
+#: ardour_ui.cc:2732
 msgid "There is no existing session at \"%1\""
 msgstr "Es gibt kein Projekt in: \"%1\""
 
-#: ardour_ui.cc:2804
+#: ardour_ui.cc:2819
 msgid "Please wait while %1 loads your session"
 msgstr "Bitte warten Sie, während %1 das Projekt lädt"
 
-#: ardour_ui.cc:2819
+#: ardour_ui.cc:2834
 msgid "Port Registration Error"
 msgstr "Fehler bei der Registrierung von Ports"
 
-#: ardour_ui.cc:2820
+#: ardour_ui.cc:2835
 msgid "Click the Close button to try again."
 msgstr "Klicken Sie auf Schließen, um es erneut zu versuchen."
 
-#: ardour_ui.cc:2841
+#: ardour_ui.cc:2856
 msgid "Session \"%1 (snapshot %2)\" did not load successfully"
 msgstr "Projekt  \"%1 (Schnappschuss %2)\" konnte nicht geladen werden."
 
-#: ardour_ui.cc:2847
+#: ardour_ui.cc:2862
 msgid "Loading Error"
 msgstr "Fehler beim Laden"
 
-#: ardour_ui.cc:2848
+#: ardour_ui.cc:2863
 msgid "Click the Refresh button to try again."
 msgstr "Klicken Sie auf Aktualisieren, um es erneut zu versuchen."
 
-#: ardour_ui.cc:2930
+#: ardour_ui.cc:2945
 msgid "Could not create session in \"%1\""
 msgstr "Konnte kein Projekt in \"%1\" anlegen"
 
-#: ardour_ui.cc:3030
+#: ardour_ui.cc:3045
 msgid "No files were ready for clean-up"
 msgstr "Keine Audiodateien zum Aufräumen vorhanden"
 
-#: ardour_ui.cc:3034 ardour_ui.cc:3044 ardour_ui.cc:3177 ardour_ui.cc:3184
+#: ardour_ui.cc:3049 ardour_ui.cc:3059 ardour_ui.cc:3192 ardour_ui.cc:3199
 #: ardour_ui_ed.cc:104
 msgid "Clean-up"
 msgstr "Aufräumen"
 
-#: ardour_ui.cc:3035
+#: ardour_ui.cc:3050
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1159,19 +1156,19 @@ msgstr ""
 "sind sie wahrscheinlich noch in einem\n"
 "älteren Schnappschuss als Region eingebunden."
 
-#: ardour_ui.cc:3094
+#: ardour_ui.cc:3109
 msgid "kilo"
 msgstr "kilo"
 
-#: ardour_ui.cc:3097
+#: ardour_ui.cc:3112
 msgid "mega"
 msgstr "mega"
 
-#: ardour_ui.cc:3100
+#: ardour_ui.cc:3115
 msgid "giga"
 msgstr "giga"
 
-#: ardour_ui.cc:3105
+#: ardour_ui.cc:3120
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1185,7 +1182,7 @@ msgstr[1] ""
 "Die folgenden %1 Dateien wurden von %2\n"
 "gelöscht und gaben %3 %4bytes Speicherplatz frei"
 
-#: ardour_ui.cc:3112
+#: ardour_ui.cc:3127
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1206,7 +1203,7 @@ msgid_plural ""
 "will release an additional %3 %4bytes of disk space.\n"
 msgstr[0] ""
 "Die folgende Datei wurde nicht benutzt\n"
-"und wurde verschoben nach: %2\n"
+"und wurde nach %2 verschoben.\n"
 "\n"
 "Nach einem Neustart von %5 kann über\n"
 "\n"
@@ -1215,7 +1212,7 @@ msgstr[0] ""
 "%3 %4bytes Speicherplatz freigegeben werden.\n"
 msgstr[1] ""
 "Die folgenden %1 Dateien waren unbenutzt\n"
-"und wurden verschoben nach: %2\n"
+"und wurden nach %2 verschoben.\n"
 "\n"
 "Nach einem Neustart von %5 kann über\n"
 "\n"
@@ -1223,11 +1220,11 @@ msgstr[1] ""
 "\n"
 "%3 %4bytes Speicherplatz freigegeben werden.\n"
 
-#: ardour_ui.cc:3172
+#: ardour_ui.cc:3187
 msgid "Are you sure you want to clean-up?"
 msgstr "Wollen Sie wirklich aufräumen?"
 
-#: ardour_ui.cc:3179
+#: ardour_ui.cc:3194
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
@@ -1239,42 +1236,42 @@ msgstr ""
 "Nach dem Aufräumen werden alle nicht benötigten Audiodateien in den \"dead "
 "sounds\" Ordner verschoben."
 
-#: ardour_ui.cc:3187
+#: ardour_ui.cc:3202
 msgid "CleanupDialog"
 msgstr "Aufräumdialog"
 
-#: ardour_ui.cc:3217
+#: ardour_ui.cc:3232
 msgid "Cleaned Files"
 msgstr "Aufgeräumte Dateien"
 
-#: ardour_ui.cc:3234
+#: ardour_ui.cc:3249
 msgid "deleted file"
 msgstr "gelöschte Datei"
 
-#: ardour_ui.cc:3326
+#: ardour_ui.cc:3341
 msgid ""
 "Video-Server was not launched by Ardour. The request to stop it is ignored."
 msgstr ""
 "Der Video-Server wurde nicht von Ardour gestartet, der Befehl ihn anzuhalten "
 "wird ignoriert."
 
-#: ardour_ui.cc:3330
+#: ardour_ui.cc:3345
 msgid "Stop Video-Server"
 msgstr "Video-Server anhalten"
 
-#: ardour_ui.cc:3331
+#: ardour_ui.cc:3346
 msgid "Do you really want to stop the Video Server?"
 msgstr "Wollen Sie den Video-Server wirklich anhalten?"
 
-#: ardour_ui.cc:3334
+#: ardour_ui.cc:3349
 msgid "Yes, Stop It"
 msgstr "Ja, anhalten."
 
-#: ardour_ui.cc:3360
+#: ardour_ui.cc:3375
 msgid "The Video Server is already started."
 msgstr "Der Video-Server läuft bereits"
 
-#: ardour_ui.cc:3362
+#: ardour_ui.cc:3377
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
@@ -1282,7 +1279,7 @@ msgstr ""
 "Ein externer Video-Server wurde konfiguriert, ist aber nicht erreichbar. Es "
 "wird keine neue Instanz gestartet."
 
-#: ardour_ui.cc:3370 ardour_ui.cc:3455
+#: ardour_ui.cc:3385 ardour_ui.cc:3475
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Edit -> Preferences."
@@ -1291,36 +1288,36 @@ msgstr ""
 "ihn vorher starten oder die Adresse in Bearbeiten -> Globale Einstellungen "
 "anpassen"
 
-#: ardour_ui.cc:3394
+#: ardour_ui.cc:3409
 msgid "Specified docroot is not an existing directory."
 msgstr "Das eingestellte Dokumentenverzeichnis existiert nicht."
 
-#: ardour_ui.cc:3399
+#: ardour_ui.cc:3414
 msgid "Given Video Server is not an executable file."
 msgstr "Der eingestellte Video-Server ist keine ausführbare Datei."
 
-#: ardour_ui.cc:3432
+#: ardour_ui.cc:3447
 msgid "Cannot launch the video-server"
-msgstr ""
+msgstr "Kann den Videoserver nicht starten "
 
-#: ardour_ui.cc:3441
+#: ardour_ui.cc:3456
 msgid "Video-server was started but does not respond to requests..."
-msgstr ""
+msgstr "Viideoserver wurde gestartet, reagiert aber nicht auf Anfragen..."
 
-#: ardour_ui.cc:3477 editor_audio_import.cc:629
+#: ardour_ui.cc:3501 editor_audio_import.cc:632
 msgid "could not open %1"
 msgstr "Konnte \"%s\" nicht öffnen."
 
-#: ardour_ui.cc:3481
+#: ardour_ui.cc:3505
 msgid "no video-file selected"
 msgstr "Es wurde keine Video-Datei ausgewählt."
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:3670
 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:3670
+#: ardour_ui.cc:3699
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1334,7 +1331,7 @@ msgstr ""
 "Die Daten konnten nicht schnell genug geschrieben\n"
 "werden, um die Aufnahme fortzuführen.\n"
 
-#: ardour_ui.cc:3689
+#: ardour_ui.cc:3718
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1348,11 +1345,11 @@ msgstr ""
 "Die Daten konnten nicht schnell genug gelesen\n"
 "werden, um die Wiedergabe aufrechtzuerhalten.\n"
 
-#: ardour_ui.cc:3729
+#: ardour_ui.cc:3758
 msgid "Crash Recovery"
 msgstr "Absturz-Wiederherstellung"
 
-#: ardour_ui.cc:3730
+#: ardour_ui.cc:3759
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1370,19 +1367,19 @@ msgstr ""
 "für Sie wiederherstellen oder sie verwerfen.\n"
 "Bitte entscheiden Sie, wie Sie vorgehen möchten.\n"
 
-#: ardour_ui.cc:3742
+#: ardour_ui.cc:3771
 msgid "Ignore crash data"
 msgstr "Daten verwerfen"
 
-#: ardour_ui.cc:3743
+#: ardour_ui.cc:3772
 msgid "Recover from crash"
 msgstr "Daten wiederherstellen"
 
-#: ardour_ui.cc:3763
+#: ardour_ui.cc:3792
 msgid "Sample Rate Mismatch"
 msgstr "Samplerate passt nicht"
 
-#: ardour_ui.cc:3764
+#: ardour_ui.cc:3793
 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"
@@ -1393,23 +1390,23 @@ 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:3773
+#: ardour_ui.cc:3802
 msgid "Do not load session"
 msgstr "Projekt nicht laden"
 
-#: ardour_ui.cc:3774
+#: ardour_ui.cc:3803
 msgid "Load session anyway"
 msgstr "Projekt trotzdem laden"
 
-#: ardour_ui.cc:3797
+#: ardour_ui.cc:3826
 msgid "Could not disconnect from JACK"
 msgstr "Konnte Verbindung mit JACK nicht trennen"
 
-#: ardour_ui.cc:3810
+#: ardour_ui.cc:3839
 msgid "Could not reconnect to JACK"
 msgstr "Konnte nicht erneut zu JACK verbinden"
 
-#: ardour_ui.cc:4084
+#: ardour_ui.cc:4113
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1444,35 +1441,39 @@ msgstr "Der Editor konnte nicht initialisiert werden."
 msgid "UI: cannot setup mixer"
 msgstr "Der Mixer konnte nicht initialisiert werden."
 
-#: ardour_ui2.cc:125
+#: ardour_ui2.cc:82
+msgid "UI: cannot setup meterbridge"
+msgstr "UI: konnte Meterbridge nicht einrichten."
+
+#: ardour_ui2.cc:130
 msgid "Play from playhead"
 msgstr "Wiedergabe ab Positionszeiger"
 
-#: ardour_ui2.cc:126
+#: ardour_ui2.cc:131
 msgid "Stop playback"
 msgstr "Wiedergabe anhalten"
 
-#: ardour_ui2.cc:127
+#: ardour_ui2.cc:132
 msgid "Toggle record"
 msgstr "Aufnahme aktivieren"
 
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:133
 msgid "Play range/selection"
 msgstr "Bereich/Auswahl wiedergeben"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:134
 msgid "Go to start of session"
 msgstr "Zum Anfang des Projekts springen"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:135
 msgid "Go to end of session"
 msgstr "Zum Ende des Projekts springen"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:136
 msgid "Play loop range"
 msgstr "Schleife wiedergeben"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:137
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
@@ -1481,23 +1482,23 @@ msgstr ""
 "Schalte auf allen Midikanälen die Notensignale aus und setzte alle MIDI-"
 "Controller zurück"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:138
 msgid "Return to last playback start when stopped"
 msgstr "Bei Stopp zum letzten Wiedergabepunkt springen"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:139
 msgid "Playhead follows Range Selections and Edits"
 msgstr "Positionszeiger folgt Auswahl und Editierungen"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:140
 msgid "Be sensible about input monitoring"
 msgstr "Automatisches Input Monitoring aktivieren"
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:141
 msgid "Enable/Disable audio click"
 msgstr "Aktiviert/Deaktiviert Klick"
 
-#: ardour_ui2.cc:137 monitor_section.cc:101
+#: ardour_ui2.cc:142 monitor_section.cc:101
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1505,7 +1506,7 @@ msgstr ""
 "Wenn aktiv, ist etwas auf Solo geschalten.\n"
 "Klick schaltet Solo überall aus."
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:143
 msgid ""
 "When active, auditioning is taking place\n"
 "Click to stop the audition"
@@ -1513,11 +1514,11 @@ msgstr ""
 "Wird beim Vorhören aktiv.\n"
 "Klicken stoppt das Vorhören."
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:144
 msgid "When active, there is a feedback loop."
 msgstr "Wenn aktiv, gibt es eine Rückkopplungsschleife."
 
-#: ardour_ui2.cc:140
+#: ardour_ui2.cc:145
 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"
@@ -1533,7 +1534,7 @@ msgstr ""
 "Siehe <span color=\"blue\">http://ardour.org/a3_features_clocks</span> für "
 "Einzelheiten."
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:146
 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"
@@ -1549,27 +1550,27 @@ msgstr ""
 "Siehe <span color=\"blue\">http://ardour.org/a3_features_clocks</span> für "
 "Einzelheiten."
 
-#: ardour_ui2.cc:173
+#: ardour_ui2.cc:178
 msgid "[ERROR]: "
 msgstr "[FEHLER]:"
 
-#: ardour_ui2.cc:175
+#: ardour_ui2.cc:180
 msgid "[WARNING]: "
 msgstr "[WARNUNG]:"
 
-#: ardour_ui2.cc:177
+#: ardour_ui2.cc:182
 msgid "[INFO]: "
 msgstr "[INFO]: "
 
-#: ardour_ui2.cc:241 ardour_ui_ed.cc:376
+#: ardour_ui2.cc:246 ardour_ui_ed.cc:377
 msgid "Auto Return"
 msgstr "Auto Return"
 
-#: ardour_ui2.cc:243 ardour_ui_ed.cc:379
+#: ardour_ui2.cc:248 ardour_ui_ed.cc:380
 msgid "Follow Edits"
 msgstr "Folge Bearbeitungen"
 
-#: ardour_ui2.cc:621 rc_option_editor.cc:1004 rc_option_editor.cc:1022
+#: ardour_ui2.cc:626 rc_option_editor.cc:1004 rc_option_editor.cc:1022
 #: rc_option_editor.cc:1025 rc_option_editor.cc:1027 rc_option_editor.cc:1029
 #: rc_option_editor.cc:1037 rc_option_editor.cc:1045 rc_option_editor.cc:1047
 #: rc_option_editor.cc:1055 rc_option_editor.cc:1062 rc_option_editor.cc:1071
@@ -1589,23 +1590,23 @@ msgstr "Editor laden"
 msgid "Setup Mixer"
 msgstr "Mixer laden"
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:85
 msgid "Reload Session History"
 msgstr "Projekt-Aktionsverlauf laden"
 
-#: ardour_ui_dialogs.cc:206
+#: ardour_ui_dialogs.cc:221
 msgid "Don't close"
 msgstr "Abbrechen"
 
-#: ardour_ui_dialogs.cc:207
+#: ardour_ui_dialogs.cc:222
 msgid "Just close"
 msgstr "Ohne speichern schließen"
 
-#: ardour_ui_dialogs.cc:208
+#: ardour_ui_dialogs.cc:223
 msgid "Save and close"
 msgstr "Speichern und schließen"
 
-#: ardour_ui_dialogs.cc:293
+#: ardour_ui_dialogs.cc:318
 msgid "This screen is not tall enough to display the mixer window"
 msgstr ""
 "Dieser Bildschirm ist nicht hoch genug, um das Mixerfenster darzustellen"
@@ -1671,7 +1672,7 @@ msgstr "Pegelanzeige halten"
 msgid "Denormal Handling"
 msgstr "Umgang mit Denormals"
 
-#: ardour_ui_ed.cc:123 route_time_axis.cc:1475
+#: ardour_ui_ed.cc:123 route_time_axis.cc:1489
 msgid "New..."
 msgstr "Neu..."
 
@@ -1692,19 +1693,16 @@ msgid "Add Track or Bus..."
 msgstr "Spur/Bus hinzufügen..."
 
 #: ardour_ui_ed.cc:135
-#, fuzzy
 msgid "Open Video"
-msgstr "Projekt öffnen"
+msgstr "Video öffnen"
 
 #: ardour_ui_ed.cc:138
-#, fuzzy
 msgid "Remove Video"
-msgstr "Bereich entfernen"
+msgstr "Video entfernen"
 
 #: ardour_ui_ed.cc:141
-#, fuzzy
 msgid "Export To Video File"
-msgstr "Exportiere Audio-Datei(en)..."
+msgstr "Exportiere Video-Datei"
 
 #: ardour_ui_ed.cc:145
 msgid "Snapshot..."
@@ -1714,8 +1712,8 @@ msgstr "Schnappschuss..."
 msgid "Save As..."
 msgstr "Speichern unter..."
 
-#: ardour_ui_ed.cc:153 editor_actions.cc:1710 editor_markers.cc:858
-#: editor_snapshots.cc:123 mixer_strip.cc:1464 route_time_axis.cc:1471
+#: ardour_ui_ed.cc:153 editor_actions.cc:1719 editor_markers.cc:858
+#: editor_snapshots.cc:123 mixer_strip.cc:1471 route_time_axis.cc:1485
 msgid "Rename..."
 msgstr "Umbenennen..."
 
@@ -1760,7 +1758,7 @@ msgstr "Müll leeren"
 msgid "JACK"
 msgstr "JACK"
 
-#: ardour_ui_ed.cc:190 route_params_ui.cc:104
+#: ardour_ui_ed.cc:190 route_params_ui.cc:105
 msgid "Latency"
 msgstr "Latenz"
 
@@ -1768,8 +1766,8 @@ msgstr "Latenz"
 msgid "Reconnect"
 msgstr "Verbinde neu"
 
-#: ardour_ui_ed.cc:195 global_port_matrix.cc:198 io_selector.cc:210
-#: mixer_strip.cc:712 mixer_strip.cc:838
+#: ardour_ui_ed.cc:195 global_port_matrix.cc:207 io_selector.cc:210
+#: mixer_strip.cc:719 mixer_strip.cc:845
 msgid "Disconnect"
 msgstr "Trenne"
 
@@ -1785,36 +1783,39 @@ msgstr "Editor maximieren"
 msgid "Show Toolbars"
 msgstr "Zeige Werkzeugleisten"
 
-#: ardour_ui_ed.cc:230 mixer_ui.cc:1863 mixer_ui.cc:1869
+#: ardour_ui_ed.cc:230 mixer_ui.cc:1865 mixer_ui.cc:1871
 msgid "Window|Mixer"
 msgstr "Mixer"
 
 #: ardour_ui_ed.cc:231
-#, fuzzy
 msgid "Toggle Editor+Mixer"
-msgstr "Bearbeitungsmodus ändern"
+msgstr "Editor+Mixer umschalten"
+
+#: ardour_ui_ed.cc:232 meterbridge.cc:230 meterbridge.cc:236
+msgid "Window|Meterbridge"
+msgstr "Meterbridge"
 
-#: ardour_ui_ed.cc:233 midi_tracer.cc:39
+#: ardour_ui_ed.cc:234 midi_tracer.cc:39
 msgid "MIDI Tracer"
 msgstr "Midisignale verfolgen"
 
-#: ardour_ui_ed.cc:235
+#: ardour_ui_ed.cc:236
 msgid "Chat"
 msgstr "Chat"
 
-#: ardour_ui_ed.cc:237
+#: ardour_ui_ed.cc:238
 msgid "Help|Manual"
 msgstr "Handbuch"
 
-#: ardour_ui_ed.cc:238
+#: ardour_ui_ed.cc:239
 msgid "Reference"
 msgstr "Referenz"
 
-#: ardour_ui_ed.cc:240 plugin_ui.cc:419
+#: ardour_ui_ed.cc:241 plugin_ui.cc:418
 msgid "Save"
 msgstr "Speichern"
 
-#: ardour_ui_ed.cc:248 rc_option_editor.cc:1114 rc_option_editor.cc:1125
+#: ardour_ui_ed.cc:249 rc_option_editor.cc:1114 rc_option_editor.cc:1125
 #: rc_option_editor.cc:1134 rc_option_editor.cc:1147 rc_option_editor.cc:1160
 #: rc_option_editor.cc:1169 rc_option_editor.cc:1179 rc_option_editor.cc:1181
 #: rc_option_editor.cc:1191 rc_option_editor.cc:1207 rc_option_editor.cc:1220
@@ -1824,99 +1825,99 @@ msgstr "Speichern"
 msgid "Transport"
 msgstr "Transport"
 
-#: ardour_ui_ed.cc:254 engine_dialog.cc:85 sfdb_ui.cc:559
+#: ardour_ui_ed.cc:255 engine_dialog.cc:85
 msgid "Stop"
 msgstr "Stopp"
 
-#: ardour_ui_ed.cc:257
+#: ardour_ui_ed.cc:258
 msgid "Roll"
 msgstr "Wiedergabe"
 
-#: ardour_ui_ed.cc:261
+#: ardour_ui_ed.cc:262
 msgid "Start/Stop"
 msgstr "Start/Stopp"
 
-#: ardour_ui_ed.cc:264
+#: ardour_ui_ed.cc:265
 msgid "Start/Continue/Stop"
 msgstr "Start/Stopp"
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:268
 msgid "Stop and Forget Capture"
 msgstr "Stopp + Aufnahme verwerfen"
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:278
 msgid "Transition To Roll"
 msgstr "Vorwärts (normal)"
 
-#: ardour_ui_ed.cc:281
+#: ardour_ui_ed.cc:282
 msgid "Transition To Reverse"
 msgstr "Rückwärts (normal)"
 
-#: ardour_ui_ed.cc:285
+#: ardour_ui_ed.cc:286
 msgid "Play Loop Range"
 msgstr "Schleife wiedergeben"
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:289
 msgid "Play Selected Range"
 msgstr "Gewählten Bereich wiedergeben"
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:292
 msgid "Play Selection w/Preroll"
 msgstr "Ausgewählten Bereich mit Vorlauf wiedergeben"
 
-#: ardour_ui_ed.cc:295
+#: ardour_ui_ed.cc:296
 msgid "Enable Record"
 msgstr "Aufnahme aktivieren"
 
-#: ardour_ui_ed.cc:298
+#: ardour_ui_ed.cc:299
 msgid "Start Recording"
 msgstr "Aufnahme starten"
 
-#: ardour_ui_ed.cc:302
+#: ardour_ui_ed.cc:303
 msgid "Rewind"
 msgstr "Rückwärts (beschleunigen)"
 
-#: ardour_ui_ed.cc:305
+#: ardour_ui_ed.cc:306
 msgid "Rewind (Slow)"
 msgstr "Rückwärts (langsam)"
 
-#: ardour_ui_ed.cc:308
+#: ardour_ui_ed.cc:309
 msgid "Rewind (Fast)"
 msgstr "Rückwärts (schnell)"
 
-#: ardour_ui_ed.cc:311 startup.cc:727
+#: ardour_ui_ed.cc:312 startup.cc:727
 msgid "Forward"
 msgstr "Vorwärts (beschleunigen)"
 
-#: ardour_ui_ed.cc:314
+#: ardour_ui_ed.cc:315
 msgid "Forward (Slow)"
 msgstr "Vorwärts (langsam)"
 
-#: ardour_ui_ed.cc:317
+#: ardour_ui_ed.cc:318
 msgid "Forward (Fast)"
 msgstr "Vorwärts (schnell)"
 
-#: ardour_ui_ed.cc:320
+#: ardour_ui_ed.cc:321
 msgid "Goto Zero"
 msgstr "Zum Nullpunkt springen"
 
-#: ardour_ui_ed.cc:323
+#: ardour_ui_ed.cc:324
 msgid "Goto Start"
 msgstr "Zum Anfang springen"
 
-#: ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:327
 msgid "Goto End"
 msgstr "Zum Ende springen"
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:330
 msgid "Goto Wall Clock"
 msgstr "Zur lokalen Uhrzeit springen"
 
-#: ardour_ui_ed.cc:333
+#: ardour_ui_ed.cc:334
 msgid "Focus On Clock"
 msgstr "Fokus auf Zeitanzeige setzen"
 
-#: ardour_ui_ed.cc:337 ardour_ui_ed.cc:346 audio_clock.cc:2046 editor.cc:237
+#: ardour_ui_ed.cc:338 ardour_ui_ed.cc:347 audio_clock.cc:2046 editor.cc:237
 #: editor_actions.cc:544 editor_actions.cc:553 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
@@ -1925,125 +1926,125 @@ msgstr "Fokus auf Zeitanzeige setzen"
 msgid "Timecode"
 msgstr "Timecode"
 
-#: ardour_ui_ed.cc:339 ardour_ui_ed.cc:348 editor_actions.cc:542
+#: ardour_ui_ed.cc:340 ardour_ui_ed.cc:349 editor_actions.cc:542
 msgid "Bars & Beats"
 msgstr "Takte & Schläge"
 
-#: ardour_ui_ed.cc:341 ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:342 ardour_ui_ed.cc:351
 msgid "Minutes & Seconds"
 msgstr "Minuten & Sekunden"
 
-#: ardour_ui_ed.cc:343 ardour_ui_ed.cc:352 audio_clock.cc:2050 editor.cc:238
+#: ardour_ui_ed.cc:344 ardour_ui_ed.cc:353 audio_clock.cc:2050 editor.cc:238
 #: editor_actions.cc:543
 msgid "Samples"
 msgstr "Samples"
 
-#: ardour_ui_ed.cc:355
+#: ardour_ui_ed.cc:356
 msgid "Punch In"
 msgstr "Punch In"
 
-#: ardour_ui_ed.cc:356 mixer_strip.cc:1904 route_ui.cc:132
+#: ardour_ui_ed.cc:357 mixer_strip.cc:1905 route_ui.cc:137
 #: time_info_box.cc:113
 msgid "In"
 msgstr "In"
 
-#: ardour_ui_ed.cc:359
+#: ardour_ui_ed.cc:360
 msgid "Punch Out"
 msgstr "Punch Out"
 
-#: ardour_ui_ed.cc:360 time_info_box.cc:114
+#: ardour_ui_ed.cc:361 time_info_box.cc:114
 msgid "Out"
 msgstr "Out"
 
-#: ardour_ui_ed.cc:363
+#: ardour_ui_ed.cc:364
 msgid "Punch In/Out"
 msgstr "Punch In/Out"
 
-#: ardour_ui_ed.cc:364
+#: ardour_ui_ed.cc:365
 msgid "In/Out"
 msgstr "In/Out"
 
-#: ardour_ui_ed.cc:367 rc_option_editor.cc:1071
+#: ardour_ui_ed.cc:368 rc_option_editor.cc:1071
 msgid "Click"
 msgstr "Klick"
 
-#: ardour_ui_ed.cc:370
+#: ardour_ui_ed.cc:371
 msgid "Auto Input"
 msgstr "Auto Input"
 
-#: ardour_ui_ed.cc:373
+#: ardour_ui_ed.cc:374
 msgid "Auto Play"
 msgstr "Auto Play"
 
-#: ardour_ui_ed.cc:384
+#: ardour_ui_ed.cc:385
 msgid "Sync Startup to Video"
 msgstr "Start mit Video synchronisieren"
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:387
 msgid "Time Master"
 msgstr "Time Master"
 
-#: ardour_ui_ed.cc:393
+#: ardour_ui_ed.cc:394
 msgid "Toggle Record Enable Track %1"
 msgstr "Aufnahme auf Spur %1 aktivieren"
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:401
 msgid "Percentage"
 msgstr "Prozent"
 
-#: ardour_ui_ed.cc:401 shuttle_control.cc:169
+#: ardour_ui_ed.cc:402 shuttle_control.cc:169
 msgid "Semitones"
 msgstr "Halbtöne"
 
-#: ardour_ui_ed.cc:405
+#: ardour_ui_ed.cc:406
 msgid "Send MTC"
 msgstr "MTC senden"
 
-#: ardour_ui_ed.cc:407
+#: ardour_ui_ed.cc:408
 msgid "Send MMC"
 msgstr "MMC senden"
 
-#: ardour_ui_ed.cc:409
+#: ardour_ui_ed.cc:410
 msgid "Use MMC"
 msgstr "Benutze MMC"
 
-#: ardour_ui_ed.cc:411 rc_option_editor.cc:1702
+#: ardour_ui_ed.cc:412 rc_option_editor.cc:1702
 msgid "Send MIDI Clock"
 msgstr "MIDI Clock senden"
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:414
 msgid "Send MIDI Feedback"
 msgstr "MIDI Feedback senden"
 
-#: ardour_ui_ed.cc:419
+#: ardour_ui_ed.cc:420
 msgid "Panic"
 msgstr "Panic"
 
-#: ardour_ui_ed.cc:559
+#: ardour_ui_ed.cc:560
 msgid "Wall Clock"
 msgstr "Uhrzeit"
 
-#: ardour_ui_ed.cc:560
+#: ardour_ui_ed.cc:561
 msgid "Disk Space"
 msgstr "Speicherplatz"
 
-#: ardour_ui_ed.cc:561
+#: ardour_ui_ed.cc:562
 msgid "DSP"
 msgstr "DSP"
 
-#: ardour_ui_ed.cc:562
+#: ardour_ui_ed.cc:563
 msgid "Buffers"
 msgstr "Puffer"
 
-#: ardour_ui_ed.cc:563
+#: ardour_ui_ed.cc:564
 msgid "JACK Sampling Rate and Latency"
 msgstr "JACK Samplerate und Latenz"
 
-#: ardour_ui_ed.cc:564
+#: ardour_ui_ed.cc:565
 msgid "Timecode Format"
 msgstr "Timecode-Format"
 
-#: ardour_ui_ed.cc:565
+#: ardour_ui_ed.cc:566
 msgid "File Format"
 msgstr "Dateiformat"
 
@@ -2093,7 +2094,7 @@ msgstr "Tempo"
 msgid "Meter"
 msgstr "Taktart"
 
-#: audio_clock.cc:1819 audio_streamview.cc:116 editor_actions.cc:1030
+#: audio_clock.cc:1819 audio_streamview.cc:116 editor_actions.cc:1039
 #: midi_region_view.cc:2991 session_metadata_dialog.cc:331
 #: session_metadata_dialog.cc:379 session_metadata_dialog.cc:435
 #: session_metadata_dialog.cc:716
@@ -2182,32 +2183,32 @@ msgid "hide track"
 msgstr "Diese Spur verbergen"
 
 #: automation_time_axis.cc:255 automation_time_axis.cc:307
-#: automation_time_axis.cc:496 gain_meter.cc:196 generic_pluginui.cc:456
-#: generic_pluginui.cc:733 panner_ui.cc:150
+#: automation_time_axis.cc:496 gain_meter.cc:195 generic_pluginui.cc:456
+#: generic_pluginui.cc:746 panner_ui.cc:150
 msgid "Automation|Manual"
 msgstr "Manuell"
 
 #: automation_time_axis.cc:257 automation_time_axis.cc:318
 #: automation_time_axis.cc:501 editor.cc:1933 editor.cc:2010
-#: editor_actions.cc:118 editor_actions.cc:1856 gain_meter.cc:199
-#: generic_pluginui.cc:459 generic_pluginui.cc:735 midi_time_axis.cc:1488
+#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:198
+#: generic_pluginui.cc:459 generic_pluginui.cc:748 midi_time_axis.cc:1488
 #: midi_time_axis.cc:1491 midi_time_axis.cc:1494 panner_ui.cc:153
 msgid "Play"
 msgstr "Wiedergabe"
 
 #: automation_time_axis.cc:259 automation_time_axis.cc:329
-#: automation_time_axis.cc:506 gain_meter.cc:202 generic_pluginui.cc:462
-#: generic_pluginui.cc:737 panner_ui.cc:156
+#: automation_time_axis.cc:506 gain_meter.cc:201 generic_pluginui.cc:462
+#: generic_pluginui.cc:750 panner_ui.cc:156
 msgid "Write"
 msgstr "Schreiben"
 
 #: automation_time_axis.cc:261 automation_time_axis.cc:340
-#: automation_time_axis.cc:511 gain_meter.cc:205 generic_pluginui.cc:465
-#: generic_pluginui.cc:739 panner_ui.cc:159
+#: automation_time_axis.cc:511 gain_meter.cc:204 generic_pluginui.cc:465
+#: generic_pluginui.cc:752 panner_ui.cc:159
 msgid "Touch"
 msgstr "Ändern"
 
-#: automation_time_axis.cc:351 generic_pluginui.cc:468
+#: automation_time_axis.cc:351 generic_pluginui.cc:468 meter_patterns.cc:108
 msgid "???"
 msgstr "???"
 
@@ -2216,7 +2217,7 @@ msgid "clear automation"
 msgstr "Automation zurücksetzen"
 
 #: automation_time_axis.cc:485 editor_actions.cc:613 editor_markers.cc:857
-#: location_ui.cc:55 plugin_selector.cc:85 route_time_axis.cc:699
+#: location_ui.cc:55 plugin_selector.cc:85 route_time_axis.cc:708
 msgid "Hide"
 msgstr "Verbergen"
 
@@ -2237,7 +2238,7 @@ msgstr "Diskret"
 msgid "Linear"
 msgstr "Linear"
 
-#: automation_time_axis.cc:543 rhythm_ferret.cc:110 route_time_axis.cc:638
+#: automation_time_axis.cc:543 rhythm_ferret.cc:110 route_time_axis.cc:647
 #: shuttle_control.cc:188
 msgid "Mode"
 msgstr "Modus"
@@ -2254,13 +2255,13 @@ msgstr "Bundle editieren"
 msgid "Direction:"
 msgstr "Richtung:"
 
-#: bundle_manager.cc:205 bundle_manager.cc:209 mixer_strip.cc:156
-#: mixer_strip.cc:2132
+#: bundle_manager.cc:205 bundle_manager.cc:209 mixer_strip.cc:158
+#: mixer_strip.cc:2127
 msgid "Input"
 msgstr "Eingang"
 
 #: bundle_manager.cc:206 bundle_manager.cc:211 bundle_manager.cc:245
-#: mixer_strip.cc:161 mixer_strip.cc:2135
+#: mixer_strip.cc:163 mixer_strip.cc:2130
 msgid "Output"
 msgstr "Ausgang"
 
@@ -2270,8 +2271,8 @@ msgid "Edit"
 msgstr "Bearbeiten"
 
 #: bundle_manager.cc:265 editor.cc:5493 editor_actions.cc:310
-#: editor_actions.cc:368 plugin_ui.cc:420 processor_box.cc:2227
-#: route_time_axis.cc:704
+#: editor_actions.cc:368 plugin_ui.cc:419 processor_box.cc:2229
+#: route_time_axis.cc:713
 msgid "Delete"
 msgstr "Löschen"
 
@@ -2439,7 +2440,7 @@ msgstr "Zeitpunkt"
 
 #: edit_note_dialog.cc:98 editor_regions.cc:114
 #: export_timespan_selector.cc:359 export_timespan_selector.cc:421
-#: location_ui.cc:313 midi_list_editor.cc:114 time_info_box.cc:105
+#: location_ui.cc:317 midi_list_editor.cc:114 time_info_box.cc:105
 msgid "Length"
 msgstr "Länge"
 
@@ -2695,7 +2696,7 @@ msgid "Editor"
 msgstr "Editor"
 
 #: editor.cc:1215 editor.cc:1225 editor.cc:4440 editor_actions.cc:130
-#: editor_actions.cc:1804
+#: editor_actions.cc:1813
 msgid "Loop"
 msgstr "Schleife"
 
@@ -2720,8 +2721,8 @@ msgstr "Symmetrisch"
 msgid "Slow"
 msgstr "Langsam"
 
-#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1606
-#: sfdb_ui.cc:1715
+#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1634
+#: sfdb_ui.cc:1743
 msgid "Fast"
 msgstr "Schnell"
 
@@ -2741,7 +2742,7 @@ msgstr "Aktivieren"
 msgid "Slowest"
 msgstr "Sehr langsam"
 
-#: editor.cc:1572 route_time_axis.cc:1863 selection.cc:1009 selection.cc:1064
+#: editor.cc:1572 route_time_axis.cc:1877 selection.cc:1009 selection.cc:1064
 msgid "programming error: "
 msgstr "Programmierfehler:"
 
@@ -2858,7 +2859,7 @@ msgid "Select All in Track"
 msgstr "Alles in der Spur auswählen"
 
 #: editor.cc:1942 editor.cc:2019 editor_actions.cc:185
-#: export_timespan_selector.cc:53 processor_box.cc:2235
+#: export_timespan_selector.cc:53 processor_box.cc:2237
 msgid "Select All"
 msgstr "Alles auswählen"
 
@@ -2910,15 +2911,15 @@ msgstr "Wähle Bereich zwischen Positionszeiger und Arbeitspunkt aus"
 msgid "Select"
 msgstr "Auswahl"
 
-#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2220
+#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2222
 msgid "Cut"
 msgstr "Ausschneiden"
 
-#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2223
+#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2225
 msgid "Copy"
 msgstr "Kopieren"
 
-#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2231
+#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2233
 msgid "Paste"
 msgstr "Einfügen"
 
@@ -3075,7 +3076,7 @@ msgstr "Wiederherstellen"
 msgid "Redo (%1)"
 msgstr "Wiederherstellen (%1)"
 
-#: editor.cc:3286 editor.cc:3310 editor_actions.cc:106 editor_actions.cc:1785
+#: editor.cc:3286 editor.cc:3310 editor_actions.cc:106 editor_actions.cc:1794
 msgid "Duplicate"
 msgstr "Duplizieren"
 
@@ -3107,8 +3108,8 @@ msgstr "Wiedergabeliste löschen"
 msgid "Keep Playlist"
 msgstr "Wiedergabeliste behalten"
 
-#: editor.cc:3877 editor_audio_import.cc:579 editor_ops.cc:5856
-#: processor_box.cc:1990 processor_box.cc:2015
+#: editor.cc:3877 editor_audio_import.cc:581 editor_ops.cc:5856
+#: processor_box.cc:2003 processor_box.cc:2028
 msgid "Cancel"
 msgstr "Abbrechen"
 
@@ -3128,7 +3129,7 @@ msgstr "Wiedergabelisten zurücksetzen"
 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:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2251
+#: editor.cc:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2253
 msgid "Edit..."
 msgstr "Bearbeiten..."
 
@@ -3177,7 +3178,7 @@ msgstr "Layering"
 msgid "Position"
 msgstr "Position"
 
-#: editor_actions.cc:101 gain_meter.cc:124 gain_meter.cc:755 panner_ui.cc:177
+#: editor_actions.cc:101 gain_meter.cc:121 gain_meter.cc:788 panner_ui.cc:177
 #: panner_ui.cc:586
 msgid "Trim"
 msgstr "Anpassen"
@@ -3190,7 +3191,7 @@ msgstr "Lautstärke"
 msgid "Ranges"
 msgstr "Bereiche"
 
-#: editor_actions.cc:104 editor_actions.cc:1781 session_option_editor.cc:145
+#: editor_actions.cc:104 editor_actions.cc:1790 session_option_editor.cc:145
 #: session_option_editor.cc:147 session_option_editor.cc:156
 #: session_option_editor.cc:163
 msgid "Fades"
@@ -3269,8 +3270,8 @@ msgstr "Zweite Zeitanzeige"
 msgid "Separate"
 msgstr "Teilen"
 
-#: editor_actions.cc:132 mixer_strip.cc:1916 route_time_axis.cc:199
-#: route_time_axis.cc:2397
+#: editor_actions.cc:132 mixer_strip.cc:1914 route_time_axis.cc:208
+#: route_time_axis.cc:2417
 msgid "Solo"
 msgstr "Solo"
 
@@ -3282,7 +3283,7 @@ msgstr "Subframes"
 msgid "Timecode fps"
 msgstr "Timecode FPS"
 
-#: editor_actions.cc:137 route_time_axis.cc:421
+#: editor_actions.cc:137 route_time_axis.cc:430
 msgid "Height"
 msgstr "Höhe"
 
@@ -3406,7 +3407,7 @@ msgstr "Positionszeiger zum Anfang des Auswahlbereichs"
 msgid "Playhead to Range End"
 msgstr "Positionszeiger zum Ende des Auswahlbereichs"
 
-#: editor_actions.cc:186 export_timespan_selector.cc:61 processor_box.cc:2237
+#: editor_actions.cc:186 export_timespan_selector.cc:61 processor_box.cc:2239
 msgid "Deselect All"
 msgstr "Nichts auswählen"
 
@@ -3674,9 +3675,9 @@ msgstr "Stille Einfügen"
 msgid "Toggle Active"
 msgstr "Spur Aktivieren / Deaktivieren"
 
-#: editor_actions.cc:370 editor_actions.cc:1707 editor_markers.cc:876
-#: editor_markers.cc:941 editor_snapshots.cc:121 mixer_strip.cc:1488
-#: route_time_axis.cc:701
+#: editor_actions.cc:370 editor_actions.cc:1716 editor_markers.cc:876
+#: editor_markers.cc:941 editor_snapshots.cc:121 mixer_strip.cc:1495
+#: route_time_axis.cc:710
 msgid "Remove"
 msgstr "Löschen"
 
@@ -3684,19 +3685,19 @@ msgstr "Löschen"
 msgid "Fit Selected Tracks"
 msgstr "An ausgewählte Spuren anpassen"
 
-#: editor_actions.cc:376 time_axis_view.cc:1298
+#: editor_actions.cc:376 time_axis_view.cc:1302
 msgid "Largest"
 msgstr "Am größten"
 
-#: editor_actions.cc:379 time_axis_view.cc:1299
+#: editor_actions.cc:379 time_axis_view.cc:1303
 msgid "Larger"
 msgstr "Größer"
 
-#: editor_actions.cc:382 editor_rulers.cc:375 time_axis_view.cc:1300
+#: editor_actions.cc:382 editor_rulers.cc:375 time_axis_view.cc:1304
 msgid "Large"
 msgstr "Groß"
 
-#: editor_actions.cc:388 editor_rulers.cc:379 time_axis_view.cc:1302
+#: editor_actions.cc:388 editor_rulers.cc:379 time_axis_view.cc:1306
 msgid "Small"
 msgstr "Klein"
 
@@ -3792,7 +3793,7 @@ msgstr "Splice"
 msgid "Slide"
 msgstr "Slide"
 
-#: editor_actions.cc:478 editor_actions.cc:1728 editor_markers.cc:860
+#: editor_actions.cc:478 editor_actions.cc:1737 editor_markers.cc:860
 #: editor_rulers.cc:386 location_ui.cc:56
 msgid "Lock"
 msgstr "Sperren"
@@ -3962,40 +3963,36 @@ msgid "Min:Sec"
 msgstr "Min:Sek"
 
 #: editor_actions.cc:547 editor_actions.cc:550
-#, fuzzy
 msgid "Video Monitor"
-msgstr "Monitor"
+msgstr "Videomonitor"
 
 #: editor_actions.cc:549 rc_option_editor.cc:1834
 msgid "Video"
-msgstr ""
+msgstr "Video"
 
 #: editor_actions.cc:552
-#, fuzzy
 msgid "Always on Top"
-msgstr "Ganz nach oben"
+msgstr "Immer oben"
 
 #: editor_actions.cc:554
-#, fuzzy
-msgid "Framenumber"
-msgstr "Liednummer"
+msgid "Frame number"
+msgstr "Framenummer"
 
 #: editor_actions.cc:555
-#, fuzzy
 msgid "Timecode Background"
-msgstr "Timecode-Sekunden"
+msgstr "Timecode-Hintergrund"
 
 #: editor_actions.cc:556
 msgid "Fullscreen"
-msgstr ""
+msgstr "Vollbild"
 
 #: editor_actions.cc:557
 msgid "Letterbox"
-msgstr ""
+msgstr "Letterbox"
 
 #: editor_actions.cc:558
 msgid "Original Size"
-msgstr ""
+msgstr "Originalgröße"
 
 #: editor_actions.cc:608
 msgid "Sort"
@@ -4067,7 +4064,7 @@ msgstr "Ungenutzte entfernen"
 
 #: editor_actions.cc:652 editor_audio_import.cc:279
 #: session_import_dialog.cc:74 session_import_dialog.cc:94
-#: session_metadata_dialog.cc:297 editor_videotimeline.cc:107
+#: session_metadata_dialog.cc:297 editor_videotimeline.cc:108
 msgid "Import"
 msgstr "Importieren"
 
@@ -4107,289 +4104,289 @@ msgstr "Editor-Tastenkürzel aus %1 geladen"
 msgid "Could not find editor.bindings in search path %1"
 msgstr "Konnte editor.bindings im Suchpfad %1 nicht finden"
 
-#: editor_actions.cc:1019 editor_actions.cc:1415 editor_actions.cc:1426
-#: editor_actions.cc:1479 editor_actions.cc:1490 editor_actions.cc:1537
-#: editor_actions.cc:1547 editor_regions.cc:1561
+#: editor_actions.cc:1028 editor_actions.cc:1424 editor_actions.cc:1435
+#: editor_actions.cc:1488 editor_actions.cc:1499 editor_actions.cc:1546
+#: editor_actions.cc:1556 editor_regions.cc:1561
 msgid "programming error: %1: %2"
 msgstr "Programmierfehler: %1: %2"
 
-#: editor_actions.cc:1713
+#: editor_actions.cc:1722
 msgid "Raise"
 msgstr "Nach oben"
 
-#: editor_actions.cc:1716
+#: editor_actions.cc:1725
 msgid "Raise to Top"
 msgstr "Ganz nach oben"
 
-#: editor_actions.cc:1719 gtk-custom-ruler.c:132
+#: editor_actions.cc:1728 gtk-custom-ruler.c:132
 msgid "Lower"
 msgstr "Nach unten"
 
-#: editor_actions.cc:1722
+#: editor_actions.cc:1731
 msgid "Lower to Bottom"
 msgstr "Ganz nach unten"
 
-#: editor_actions.cc:1725
+#: editor_actions.cc:1734
 msgid "Move to Original Position"
 msgstr "Zur Ursprungsposition verschieben"
 
-#: editor_actions.cc:1730
+#: editor_actions.cc:1739
 msgid "Lock to Video"
-msgstr ""
+msgstr "an Video koppeln"
 
-#: editor_actions.cc:1735 editor_markers.cc:867
+#: editor_actions.cc:1744 editor_markers.cc:867
 msgid "Glue to Bars and Beats"
 msgstr "An Takte und Schläge binden"
 
-#: editor_actions.cc:1740
+#: editor_actions.cc:1749
 msgid "Remove Sync"
 msgstr "Synchronisationspunkt entfernen"
 
-#: editor_actions.cc:1743 mixer_strip.cc:1903 route_time_axis.cc:200
+#: editor_actions.cc:1752 mixer_strip.cc:1904 route_time_axis.cc:209
 msgid "Mute"
 msgstr "Mute"
 
-#: editor_actions.cc:1746
+#: editor_actions.cc:1755
 msgid "Normalize..."
 msgstr "Normalisieren..."
 
-#: editor_actions.cc:1749
+#: editor_actions.cc:1758
 msgid "Reverse"
 msgstr "Umkehren"
 
-#: editor_actions.cc:1752
+#: editor_actions.cc:1761
 msgid "Make Mono Regions"
 msgstr "In Mono-Regionen umwandeln"
 
-#: editor_actions.cc:1755
+#: editor_actions.cc:1764
 msgid "Boost Gain"
 msgstr "Lautstärke erhöhen"
 
-#: editor_actions.cc:1758
+#: editor_actions.cc:1767
 msgid "Cut Gain"
 msgstr "Lautstärke reduzieren"
 
-#: editor_actions.cc:1761
+#: editor_actions.cc:1770
 msgid "Pitch Shift..."
 msgstr "Tonhöhe ändern..."
 
-#: editor_actions.cc:1764
+#: editor_actions.cc:1773
 msgid "Transpose..."
 msgstr "Transponieren..."
 
-#: editor_actions.cc:1767
+#: editor_actions.cc:1776
 msgid "Opaque"
 msgstr "Deckend"
 
-#: editor_actions.cc:1771 editor_regions.cc:116
+#: editor_actions.cc:1780 editor_regions.cc:116
 msgid "Fade In"
 msgstr "Fade In"
 
-#: editor_actions.cc:1776 editor_regions.cc:117
+#: editor_actions.cc:1785 editor_regions.cc:117
 msgid "Fade Out"
 msgstr "Fade Out"
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1800
 msgid "Multi-Duplicate..."
 msgstr "Mehrfach duplizieren..."
 
-#: editor_actions.cc:1796
+#: editor_actions.cc:1805
 msgid "Fill Track"
 msgstr "Spur auffüllen"
 
-#: editor_actions.cc:1800 editor_markers.cc:955
+#: editor_actions.cc:1809 editor_markers.cc:955
 msgid "Set Loop Range"
 msgstr "Schleife erstellen"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1816
 msgid "Set Punch"
 msgstr "Punchbereich erstellen"
 
-#: editor_actions.cc:1811
+#: editor_actions.cc:1820
 msgid "Add Single Range Marker"
 msgstr "Einzelnen Bereichsmarker einfügen"
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1825
 msgid "Add Range Marker Per Region"
 msgstr "Einen Bereichsmarker pro Region einfügen"
 
-#: editor_actions.cc:1820
+#: editor_actions.cc:1829
 msgid "Snap Position To Grid"
 msgstr "Positionszeiger einrasten"
 
-#: editor_actions.cc:1823
+#: editor_actions.cc:1832
 msgid "Close Gaps"
 msgstr "Lücken schließen"
 
-#: editor_actions.cc:1826
+#: editor_actions.cc:1835
 msgid "Rhythm Ferret..."
 msgstr "Rhythm Ferret..."
 
-#: editor_actions.cc:1829
+#: editor_actions.cc:1838
 msgid "Export..."
 msgstr "Exportieren..."
 
-#: editor_actions.cc:1835
+#: editor_actions.cc:1844
 msgid "Separate Under"
 msgstr "Bereich unter aktueller Region entfernen"
 
-#: editor_actions.cc:1839
+#: editor_actions.cc:1848
 msgid "Set Fade In Length"
 msgstr "Fade-In bis Positionszeiger"
 
-#: editor_actions.cc:1840
+#: editor_actions.cc:1849
 msgid "Set Fade Out Length"
 msgstr "Fade-Out ab Positionszeiger"
 
-#: editor_actions.cc:1841
+#: editor_actions.cc:1850
 msgid "Set Tempo from Region = Bar"
 msgstr "Regionlänge = Taktlänge setzen"
 
-#: editor_actions.cc:1846
+#: editor_actions.cc:1855
 msgid "Split at Percussion Onsets"
 msgstr "Regionen an perkussiven Schlägen teilen"
 
-#: editor_actions.cc:1851
+#: editor_actions.cc:1860
 msgid "List Editor..."
 msgstr "Eventlisteneditor..."
 
-#: editor_actions.cc:1854
+#: editor_actions.cc:1863
 msgid "Properties..."
 msgstr "Eigenschaften..."
 
-#: editor_actions.cc:1858
+#: editor_actions.cc:1867
 msgid "Bounce (with processing)"
 msgstr "Bounce (Post-Mixer)"
 
-#: editor_actions.cc:1859
+#: editor_actions.cc:1868
 msgid "Bounce (without processing)"
 msgstr "Bounce (Pre-Mixer)"
 
-#: editor_actions.cc:1860
+#: editor_actions.cc:1869
 msgid "Combine"
 msgstr "Verbinden (combine)"
 
-#: editor_actions.cc:1861
+#: editor_actions.cc:1870
 msgid "Uncombine"
 msgstr "Trennen (uncombine)"
 
-#: editor_actions.cc:1863
+#: editor_actions.cc:1872
 msgid "Spectral Analysis..."
 msgstr "FFT-Analyse"
 
-#: editor_actions.cc:1865
+#: editor_actions.cc:1874
 msgid "Reset Envelope"
 msgstr "Lautstärkekurve zurücksetzen"
 
-#: editor_actions.cc:1867
+#: editor_actions.cc:1876
 msgid "Reset Gain"
 msgstr "Lautstärke zurücksetzen"
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1881
 msgid "Envelope Active"
 msgstr "Lautstärkekurve ist aktiv"
 
-#: editor_actions.cc:1876
+#: editor_actions.cc:1885
 msgid "Quantize..."
 msgstr "Quantisieren.."
 
-#: editor_actions.cc:1877 editor_actions.cc:1878
+#: editor_actions.cc:1886 editor_actions.cc:1887
 msgid "Insert Patch Change..."
 msgstr "Patch Change einfügen..."
 
-#: editor_actions.cc:1879
+#: editor_actions.cc:1888
 msgid "Unlink from other copies"
 msgstr "Von anderen Kopien entkoppeln"
 
-#: editor_actions.cc:1880
+#: editor_actions.cc:1889
 msgid "Strip Silence..."
 msgstr "Stille entfernen..."
 
-#: editor_actions.cc:1881
+#: editor_actions.cc:1890
 msgid "Set Range Selection"
 msgstr "Bereich auswählen"
 
-#: editor_actions.cc:1883
+#: editor_actions.cc:1892
 msgid "Nudge Later"
 msgstr "Schritt nach hinten"
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1893
 msgid "Nudge Earlier"
 msgstr "Schritt nach vorne"
 
-#: editor_actions.cc:1889
+#: editor_actions.cc:1898
 msgid "Nudge Later by Capture Offset"
 msgstr "Schritt nach hinten um Aufnahme-Offset"
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1905
 msgid "Nudge Earlier by Capture Offset"
 msgstr "Schritt nach vorne um Aufnahme-Offset"
 
-#: editor_actions.cc:1900
+#: editor_actions.cc:1909
 msgid "Trim to Loop"
 msgstr "Auf Schleife kürzen"
 
-#: editor_actions.cc:1901
+#: editor_actions.cc:1910
 msgid "Trim to Punch"
 msgstr "Auf Punchbereich kürzen"
 
-#: editor_actions.cc:1903
+#: editor_actions.cc:1912
 msgid "Trim to Previous"
 msgstr "Zur vorherigen Region aufschließen"
 
-#: editor_actions.cc:1904
+#: editor_actions.cc:1913
 msgid "Trim to Next"
 msgstr "Zur nächsten Region aufschließen"
 
-#: editor_actions.cc:1911
+#: editor_actions.cc:1920
 msgid "Insert Region From Region List"
 msgstr "Region von Regionenliste hinzufügen"
 
-#: editor_actions.cc:1917
+#: editor_actions.cc:1926
 msgid "Set Sync Position"
 msgstr "Synchronisationspunkt setzen"
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1927
 msgid "Place Transient"
 msgstr "Transienten setzen"
 
-#: editor_actions.cc:1919
+#: editor_actions.cc:1928
 msgid "Split"
 msgstr "Region teilen"
 
-#: editor_actions.cc:1920
+#: editor_actions.cc:1929
 msgid "Trim Start at Edit Point"
 msgstr "Anfang der Region am Arbeitspunkt abschneiden"
 
-#: editor_actions.cc:1921
+#: editor_actions.cc:1930
 msgid "Trim End at Edit Point"
 msgstr "Ende der Region am Arbeitspunkt abschneiden"
 
-#: editor_actions.cc:1926
+#: editor_actions.cc:1935
 msgid "Align Start"
 msgstr "Anfang ausrichten"
 
-#: editor_actions.cc:1933
+#: editor_actions.cc:1942
 msgid "Align Start Relative"
 msgstr "Anfang relativ ausrichten"
 
-#: editor_actions.cc:1937
+#: editor_actions.cc:1946
 msgid "Align End"
 msgstr "Ende ausrichten"
 
-#: editor_actions.cc:1942
+#: editor_actions.cc:1951
 msgid "Align End Relative"
 msgstr "Ende relativ ausrichten"
 
-#: editor_actions.cc:1949
+#: editor_actions.cc:1958
 msgid "Align Sync"
 msgstr "Synchronisationspunkt ausrichten"
 
-#: editor_actions.cc:1956
+#: editor_actions.cc:1965
 msgid "Align Sync Relative"
 msgstr "Synchronisationspunkt relativ ausrichten"
 
-#: editor_actions.cc:1960 editor_actions.cc:1963
+#: editor_actions.cc:1969 editor_actions.cc:1972
 msgid "Choose Top..."
 msgstr "Oberste Region auswählen..."
 
@@ -4418,32 +4415,32 @@ msgstr ""
 "Das Projekt enthält bereits eine Datei namens %1. Wollen Sie %2 als neue "
 "Quelle importieren, oder überspringen?"
 
-#: editor_audio_import.cc:279 editor_videotimeline.cc:107
+#: editor_audio_import.cc:279 editor_videotimeline.cc:108
 msgid "Cancel Import"
 msgstr "Importieren Abbrechen"
 
-#: editor_audio_import.cc:541
+#: editor_audio_import.cc:543
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Editor: kann die Datei \"%1\" nicht öffnen (%2)"
 
-#: editor_audio_import.cc:549
+#: editor_audio_import.cc:551
 msgid "Cancel entire import"
 msgstr "Importieren Abbrechen"
 
-#: editor_audio_import.cc:550
+#: editor_audio_import.cc:552
 msgid "Don't embed it"
 msgstr "Nicht einbetten"
 
-#: editor_audio_import.cc:551
+#: editor_audio_import.cc:553
 msgid "Embed all without questions"
 msgstr "Alle Importieren ohne nachzufragen"
 
-#: editor_audio_import.cc:554 editor_audio_import.cc:583
+#: editor_audio_import.cc:556 editor_audio_import.cc:585
 #: export_format_dialog.cc:58
 msgid "Sample rate"
 msgstr "Samplerate"
 
-#: editor_audio_import.cc:555 editor_audio_import.cc:584
+#: editor_audio_import.cc:557 editor_audio_import.cc:586
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4452,7 +4449,7 @@ msgstr ""
 "Die Samplerate dieser Audiodatei unterscheidet sich von der Samplerate "
 "dieses Projekts."
 
-#: editor_audio_import.cc:580
+#: editor_audio_import.cc:582
 msgid "Embed it anyway"
 msgstr "Trotzdem importieren"
 
@@ -4461,17 +4458,16 @@ msgid "fixed time region drag"
 msgstr "Region zeitgleich verschieben"
 
 #: editor_drag.cc:1700
-#, fuzzy
 msgid "Video Start:"
-msgstr "Mike Start"
+msgstr "Videostart"
 
 #: editor_drag.cc:1702
 msgid "Diff:"
-msgstr ""
+msgstr "Diff:"
 
 #: editor_drag.cc:1722
 msgid "Move Video"
-msgstr ""
+msgstr "Bewege Video"
 
 #: editor_drag.cc:2200
 msgid "copy meter mark"
@@ -4582,7 +4578,7 @@ msgid "Sharing Solo?"
 msgstr "Solo teilen?"
 
 #: editor_route_groups.cc:103 midi_time_axis.cc:1504 midi_time_axis.cc:1507
-#: midi_time_axis.cc:1510 mixer_strip.cc:1902
+#: midi_time_axis.cc:1510 mixer_strip.cc:1903
 msgid "Rec"
 msgstr "Rec"
 
@@ -4654,7 +4650,7 @@ msgid "end"
 msgstr "Ende"
 
 #: editor_markers.cc:646 editor_ops.cc:1744 editor_ops.cc:1764
-#: editor_ops.cc:1788 editor_ops.cc:1815 location_ui.cc:1005
+#: editor_ops.cc:1788 editor_ops.cc:1815 location_ui.cc:1017
 msgid "add marker"
 msgstr "Marker hinzufügen"
 
@@ -4662,7 +4658,7 @@ msgstr "Marker hinzufügen"
 msgid "range"
 msgstr "Bereich"
 
-#: editor_markers.cc:713 location_ui.cc:840
+#: editor_markers.cc:713 location_ui.cc:852
 msgid "remove marker"
 msgstr "Marker entfernen"
 
@@ -4738,8 +4734,8 @@ msgstr "Marker umbenennen"
 msgid "Rename Range"
 msgstr "Bereich umbenennen"
 
-#: editor_markers.cc:1363 editor_mouse.cc:2510 processor_box.cc:1768
-#: processor_box.cc:2233 route_time_axis.cc:968 route_ui.cc:1535
+#: editor_markers.cc:1363 editor_mouse.cc:2510 processor_box.cc:1781
+#: processor_box.cc:2235 route_time_axis.cc:982 route_ui.cc:1540
 msgid "Rename"
 msgstr "Umbenennen"
 
@@ -4876,7 +4872,7 @@ msgstr "Regionen ganz nach unten"
 msgid "Rename Region"
 msgstr "Region umbenennen"
 
-#: editor_ops.cc:2372 processor_box.cc:1766 route_ui.cc:1533
+#: editor_ops.cc:2372 processor_box.cc:1779 route_ui.cc:1538
 msgid "New name:"
 msgstr "Neuer Name: "
 
@@ -5053,7 +5049,7 @@ msgstr ""
 "(Dies kann nicht rückgängig gemacht werden!)"
 
 #: editor_ops.cc:4509 editor_ops.cc:6512 editor_regions.cc:460
-#: editor_snapshots.cc:158 route_ui.cc:1477
+#: editor_snapshots.cc:158 route_ui.cc:1482
 msgid "No, do nothing."
 msgstr "Nein, nichts machen."
 
@@ -5094,9 +5090,8 @@ msgid "toggle region lock"
 msgstr "Regionensperre umschalten"
 
 #: editor_ops.cc:5067
-#, fuzzy
 msgid "Toggle Video Lock"
-msgstr "Regionensperre umschalten"
+msgstr "Videosperre umschalten"
 
 #: editor_ops.cc:5091
 msgid "region lock style"
@@ -5242,11 +5237,11 @@ msgstr "Ok"
 msgid "close region gaps"
 msgstr "Schließe Lücken zwischen Regionen"
 
-#: editor_ops.cc:6461 route_ui.cc:1451
+#: editor_ops.cc:6461 route_ui.cc:1456
 msgid "That would be bad news ...."
 msgstr "Lieber nicht!"
 
-#: editor_ops.cc:6466 route_ui.cc:1456
+#: editor_ops.cc:6466 route_ui.cc:1461
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5266,7 +5261,7 @@ msgstr ""
 msgid "tracks"
 msgstr "Spuren"
 
-#: editor_ops.cc:6485 route_ui.cc:1817
+#: editor_ops.cc:6485 route_ui.cc:1822
 msgid "track"
 msgstr "Spur"
 
@@ -5274,7 +5269,7 @@ msgstr "Spur"
 msgid "busses"
 msgstr "Audio-Busse"
 
-#: editor_ops.cc:6491 route_ui.cc:1817
+#: editor_ops.cc:6491 route_ui.cc:1822
 msgid "bus"
 msgstr "Bus"
 
@@ -5319,7 +5314,7 @@ msgstr ""
 msgid "Yes, remove them."
 msgstr "Ja, entfernen."
 
-#: editor_ops.cc:6516 editor_snapshots.cc:159 route_ui.cc:1478
+#: editor_ops.cc:6516 editor_snapshots.cc:159 route_ui.cc:1483
 msgid "Yes, remove it."
 msgstr "Ja, entfernen."
 
@@ -5389,7 +5384,7 @@ msgstr "Länge des Einblendens (Einheiten: sekundäre Uhr), () falls inaktiv"
 msgid "Length of region fade-out (units: secondary clock), () if dsisabled"
 msgstr "Länge des Ausblendens (Einheiten: sekundäre Uhr), () falls inaktiv"
 
-#: editor_regions.cc:118 mixer_strip.cc:1960 mono_panner.cc:179
+#: editor_regions.cc:118 mixer_strip.cc:1954 mono_panner.cc:179
 #: stereo_panner.cc:217 stereo_panner.cc:240
 msgid "L"
 msgstr "L"
@@ -5406,8 +5401,9 @@ msgstr "G"
 msgid "Region position glued to Bars|Beats time?"
 msgstr "Regionenposition an Takt und Schäge gebunden?"
 
-#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:723
-#: mixer_strip.cc:1934 panner_ui.cc:554 stereo_panner.cc:237
+#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:756
+#: mixer_strip.cc:1931 meter_strip.cc:312 panner_ui.cc:554
+#: stereo_panner.cc:237
 msgid "M"
 msgstr "M"
 
@@ -5476,7 +5472,8 @@ msgstr "Spur/Busname"
 msgid "Track/Bus visible ?"
 msgstr "Spuren/Busse sichtbar?"
 
-#: editor_routes.cc:204 mixer_strip.cc:1951 route_time_axis.cc:2387
+#: editor_routes.cc:204 mixer_strip.cc:1945 meter_strip.cc:326
+#: route_time_axis.cc:2407
 msgid "A"
 msgstr "A"
 
@@ -5484,7 +5481,7 @@ msgstr "A"
 msgid "Track/Bus active ?"
 msgstr "Spur/Bus aktiv?"
 
-#: editor_routes.cc:205 mixer_strip.cc:1935
+#: editor_routes.cc:205 mixer_strip.cc:1932
 msgid "I"
 msgstr "I"
 
@@ -5492,7 +5489,7 @@ msgstr "I"
 msgid "MIDI input enabled"
 msgstr "MIDI Eingänge aktiv"
 
-#: editor_routes.cc:206 mixer_strip.cc:1933 mono_panner.cc:198
+#: editor_routes.cc:206 mixer_strip.cc:1930 mono_panner.cc:198
 #: stereo_panner.cc:215 stereo_panner.cc:242
 msgid "R"
 msgstr "R"
@@ -5505,7 +5502,7 @@ msgstr "Aufnahme bereit"
 msgid "Muted"
 msgstr "Stumm"
 
-#: editor_routes.cc:208 mixer_strip.cc:1947
+#: editor_routes.cc:208 mixer_strip.cc:1941 meter_strip.cc:322
 msgid "S"
 msgstr "S"
 
@@ -5517,7 +5514,7 @@ msgstr "Solo ein"
 msgid "SI"
 msgstr "SI"
 
-#: editor_routes.cc:209 mixer_strip.cc:351 rc_option_editor.cc:1872
+#: editor_routes.cc:209 mixer_strip.cc:353 rc_option_editor.cc:1872
 msgid "Solo Isolated"
 msgstr "Isoliertes Solo"
 
@@ -5595,12 +5592,11 @@ msgstr "Taktwechsel einfügen..."
 
 #: editor_rulers.cc:373
 msgid "Timeline height"
-msgstr ""
+msgstr "Höhe der Zeitleiste"
 
 #: editor_rulers.cc:383
-#, fuzzy
 msgid "Align Video Track"
-msgstr "Audiospur hinzufügen"
+msgstr "Videospur ausrichten"
 
 #: editor_selection.cc:889 editor_selection.cc:932
 msgid "set selected regions"
@@ -5853,7 +5849,7 @@ msgstr "Treiber:"
 msgid "Audio Interface:"
 msgstr "Audio-Schnittstelle:"
 
-#: engine_dialog.cc:187 sfdb_ui.cc:148 sfdb_ui.cc:261 sfdb_ui.cc:266
+#: engine_dialog.cc:187 sfdb_ui.cc:149 sfdb_ui.cc:262 sfdb_ui.cc:267
 msgid "Sample rate:"
 msgstr "Samplerate:"
 
@@ -5992,7 +5988,7 @@ msgid "configuration files contain a JACK server path that doesn't exist (%1)"
 msgstr ""
 "die Konfiguration enthält einen JACK-Serverpfad, der nicht existiert (%1)"
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:146
+#: export_channel_selector.cc:45 sfdb_ui.cc:147
 msgid "Channels:"
 msgstr "Kanäle:"
 
@@ -6017,14 +6013,12 @@ msgid "Track output (channels: %1)"
 msgstr "Spurausgang (%1 Kanäle)"
 
 #: export_channel_selector.cc:536
-#, fuzzy
 msgid "Export region contents"
-msgstr "Region exportieren"
+msgstr "Regioneninhalte exportieren"
 
 #: export_channel_selector.cc:537
-#, fuzzy
 msgid "Export track output"
-msgstr "Verbinde Spur- und Busausgänge"
+msgstr "Exportiere Spurausgänge"
 
 #: export_dialog.cc:46
 msgid ""
@@ -6279,6 +6273,10 @@ msgstr "FLAC Optionen"
 msgid "Broadcast Wave options"
 msgstr "Broadcast Wave Optionen"
 
+#: export_format_selector.cc:136
+msgid "Do you really want to remove the format?"
+msgstr "Wollen Sie das Format wirklich entfernen?"
+
 #: export_preset_selector.cc:28
 msgid "Preset"
 msgstr "Preset"
@@ -6291,6 +6289,10 @@ msgstr ""
 "Das ausgewählte Preset konnte nicht geladen werden!\n"
 "Möglicherweise verwendet es ein Format, das entfernt wurde."
 
+#: export_preset_selector.cc:156
+msgid "Do you really want to remove this preset?"
+msgstr "Wollen Sie dieses Preset wirklich entfernen?"
+
 #: export_timespan_selector.cc:46
 msgid "Show Times as:"
 msgstr "Zeitanzeige:"
@@ -6303,36 +6305,32 @@ msgstr " bis"
 msgid "Range"
 msgstr "Bereiche"
 
-#: gain_meter.cc:109 gain_meter.cc:431 gain_meter.cc:820
+#: gain_meter.cc:106 gain_meter.cc:357 gain_meter.cc:462 gain_meter.cc:853
 msgid "-inf"
 msgstr "-inf"
 
-#: gain_meter.cc:115 gain_meter.cc:869
+#: gain_meter.cc:112 gain_meter.cc:910
 msgid "Fader automation mode"
 msgstr "Fader Automationsmodus"
 
-#: gain_meter.cc:116 gain_meter.cc:870
+#: gain_meter.cc:113 gain_meter.cc:911
 msgid "Fader automation type"
 msgstr "Fader-Automationstyp"
 
-#: gain_meter.cc:125 gain_meter.cc:759 panner_ui.cc:178 panner_ui.cc:590
+#: gain_meter.cc:122 gain_meter.cc:792 panner_ui.cc:178 panner_ui.cc:590
 msgid "Abs"
 msgstr "Abs"
 
-#: gain_meter.cc:334
-msgid "-Inf"
-msgstr "-Inf"
-
-#: gain_meter.cc:726 mixer_strip.cc:1954 panner_ui.cc:557
-#: route_time_axis.cc:2391
+#: gain_meter.cc:759 mixer_strip.cc:1948 meter_strip.cc:329 panner_ui.cc:557
+#: route_time_axis.cc:2411
 msgid "P"
 msgstr "P"
 
-#: gain_meter.cc:729 panner_ui.cc:560
+#: gain_meter.cc:762 panner_ui.cc:560
 msgid "T"
 msgstr "T"
 
-#: gain_meter.cc:732 panner_ui.cc:563
+#: gain_meter.cc:765 panner_ui.cc:563
 msgid "W"
 msgstr "W"
 
@@ -6344,7 +6342,7 @@ msgstr "<span size=\"large\">Voreinstellungen</span>"
 msgid "Switches"
 msgstr "Schalter"
 
-#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2210
+#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2212
 msgid "Controls"
 msgstr "Steuerelemente"
 
@@ -6372,63 +6370,63 @@ msgstr "Audio Verbindungsmanager"
 msgid "MIDI Connection Manager"
 msgstr "Midi Verbindungsmanager"
 
-#: global_port_matrix.cc:204 io_selector.cc:216
+#: global_port_matrix.cc:213 io_selector.cc:216
 msgid "port"
 msgstr "Port"
 
-#: group_tabs.cc:306
+#: group_tabs.cc:308
 msgid "Selection..."
 msgstr "Ausgewählten Spuren"
 
-#: group_tabs.cc:307
+#: group_tabs.cc:309
 msgid "Record Enabled..."
 msgstr "Spuren, deren Aufnahme aktiviert ist"
 
-#: group_tabs.cc:308
+#: group_tabs.cc:310
 msgid "Soloed..."
 msgstr "Solo-Spuren/Busse"
 
-#: group_tabs.cc:314
+#: group_tabs.cc:316
 msgid "Create New Group ..."
 msgstr "Neue Gruppe erzeugen ..."
 
-#: group_tabs.cc:315
+#: group_tabs.cc:317
 msgid "Create New Group From"
 msgstr "Neue Gruppe erzeugen aus"
 
-#: group_tabs.cc:318
+#: group_tabs.cc:320
 msgid "Edit Group..."
 msgstr "Gruppe bearbeiten..."
 
-#: group_tabs.cc:319
+#: group_tabs.cc:321
 msgid "Collect Group"
 msgstr "Gruppe sammeln"
 
-#: group_tabs.cc:320
+#: group_tabs.cc:322
 msgid "Remove Group"
 msgstr "Gruppe entfernen"
 
-#: group_tabs.cc:323
+#: group_tabs.cc:325
 msgid "Remove Subgroup Bus"
 msgstr "Subgruppen-Bus entfernen"
 
-#: group_tabs.cc:325
+#: group_tabs.cc:327
 msgid "Add New Subgroup Bus"
 msgstr "Subgruppen-Bus hinzufügen"
 
-#: group_tabs.cc:327
+#: group_tabs.cc:329
 msgid "Add New Aux Bus (pre-fader)"
 msgstr "Aux-Send zur Subgruppe hinzufügen (Pre-Fader)"
 
-#: group_tabs.cc:328
+#: group_tabs.cc:330
 msgid "Add New Aux Bus (post-fader)"
 msgstr "Aux-Send zur Subgruppe hinzufügen (Post-Fader)"
 
-#: group_tabs.cc:334
+#: group_tabs.cc:336
 msgid "Enable All Groups"
 msgstr "Alle Gruppen aktivieren"
 
-#: group_tabs.cc:335
+#: group_tabs.cc:337
 msgid "Disable All Groups"
 msgstr "Alle Gruppen deaktivieren"
 
@@ -6524,11 +6522,11 @@ msgstr "Importiere Datei: %1 von %2"
 msgid "I/O selector"
 msgstr "E/A Auswahl"
 
-#: io_selector.cc:266
+#: io_selector.cc:265
 msgid "%1 input"
 msgstr "%1 Eingang"
 
-#: io_selector.cc:268
+#: io_selector.cc:267
 msgid "%1 output"
 msgstr "%1 Ausgang"
 
@@ -6608,7 +6606,7 @@ msgstr[1] "%1 Samples"
 msgid "Reset"
 msgstr "Zurücksetzen"
 
-#: latency_gui.cc:151 rhythm_ferret.cc:274 sfdb_ui.cc:1734
+#: latency_gui.cc:151 rhythm_ferret.cc:274 sfdb_ui.cc:1762
 msgid "programming error: %1 (%2)"
 msgstr "Programmierfehler: %1 (%2)"
 
@@ -6636,63 +6634,63 @@ msgstr "Komponist:"
 msgid "Pre-Emphasis"
 msgstr "Präemphase"
 
-#: location_ui.cc:310
+#: location_ui.cc:314
 msgid "Remove this range"
 msgstr "Diesen Bereich entfernen"
 
-#: location_ui.cc:311
+#: location_ui.cc:315
 msgid "Start time - middle click to locate here"
 msgstr "Startzeit - Mittelklick, um hierher zu positionieren"
 
-#: location_ui.cc:312
+#: location_ui.cc:316
 msgid "End time - middle click to locate here"
 msgstr "Endzeit - Mittelklick, um hierher zu positionieren"
 
-#: location_ui.cc:315
+#: location_ui.cc:319
 msgid "Set range start from playhead location"
 msgstr "Bereichsbeginn auf Positionszeiger setzen"
 
-#: location_ui.cc:316
+#: location_ui.cc:320
 msgid "Set range end from playhead location"
 msgstr "Bereichsende auf Positionszeiger setzen"
 
-#: location_ui.cc:320
+#: location_ui.cc:324
 msgid "Remove this marker"
 msgstr "Diesen Marker entfernen"
 
-#: location_ui.cc:321
+#: location_ui.cc:325
 msgid "Position - middle click to locate here"
 msgstr "Position - Mittelklick, um hierher zu positionieren"
 
-#: location_ui.cc:323
+#: location_ui.cc:327
 msgid "Set marker time from playhead location"
 msgstr "Markerposition auf Positionszeiger setzen"
 
-#: location_ui.cc:462
+#: location_ui.cc:494
 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:708
+#: location_ui.cc:720
 msgid "New Marker"
 msgstr "Neuer Marker"
 
-#: location_ui.cc:709
+#: location_ui.cc:721
 msgid "New Range"
 msgstr "Neuer Bereich"
 
-#: location_ui.cc:722
+#: location_ui.cc:734
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "<b>Schleifen/Punchbereiche</b>"
 
-#: location_ui.cc:747
+#: location_ui.cc:759
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>Marker (Inclusive CD Index)</b>"
 
-#: location_ui.cc:782
+#: location_ui.cc:794
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>Bereiche (Inclusive CD Track-Bereichen)</b>"
 
-#: location_ui.cc:1024
+#: location_ui.cc:1036
 msgid "add range marker"
 msgstr "Bereich hinzufügen"
 
@@ -6850,89 +6848,82 @@ msgid "Force"
 msgstr "Force"
 
 #: midi_channel_selector.cc:330 midi_channel_selector.cc:372
-#, fuzzy
 msgid "MIDI Channel Control"
-msgstr "Kanalfarben"
+msgstr "MIDI-Kanaleinstellungen"
 
 #: midi_channel_selector.cc:332
-#, fuzzy
 msgid "Playback all channels"
-msgstr "Alle Kanäle verbergen"
+msgstr "Alle Kanäle wiedergeben"
 
 #: midi_channel_selector.cc:333
-#, fuzzy
 msgid "Play only selected channels"
-msgstr "Gewählten Bereich abspielen"
+msgstr "Nur ausgewählte Kanäle abspielen"
 
 #: midi_channel_selector.cc:334
 msgid "Use a single fixed channel for all playback"
-msgstr ""
+msgstr "Benutze einen einzelnen festen Kanal für gesamte Wiedergabe"
 
 #: midi_channel_selector.cc:335
-#, fuzzy
 msgid "Record all channels"
-msgstr "Alle Kanäle verbergen"
+msgstr "Alle Kanäle aufnehmen"
 
 #: midi_channel_selector.cc:336
-#, fuzzy
 msgid "Record only selected channels"
-msgstr "Kanal bearbeiten"
+msgstr "Nur ausgewählte Kanäle aufnehmen"
 
 #: midi_channel_selector.cc:337
-#, fuzzy
 msgid "Force all channels to 1 channel"
-msgstr "Kanal ändern"
+msgstr "Alle Kanäle auf einem Kanal wiedergeben"
 
 #: midi_channel_selector.cc:378
-#, fuzzy
 msgid "Inbound"
-msgstr "Regionengrenzen"
+msgstr "Eingehend"
 
 #: midi_channel_selector.cc:398
-#, fuzzy
 msgid "Click to enable recording all channels"
-msgstr "Klicke, um dieses Plugin zu ein/auszuschalten"
+msgstr "Klicke, um Aufnahme aller Kanäle zuzulassen"
 
 #: midi_channel_selector.cc:403
 msgid "Click to disable recording all channels"
-msgstr ""
+msgstr "Klicke, um Aufnahme für alle Kanäle abzuschalten"
 
 #: midi_channel_selector.cc:408
 msgid "Click to invert currently selected recording channels"
 msgstr ""
+"Klicke, um die gegenwärtige Auswahl der aufnehmenden Kanäle zu invertieren"
 
 #: midi_channel_selector.cc:415
-#, fuzzy
 msgid "Playback"
-msgstr "Nur Wiedergabe"
+msgstr "Wiedergabe"
 
 #: midi_channel_selector.cc:434
 msgid "Click to enable playback of all channels"
-msgstr ""
+msgstr "Klicke, um Wiedergabe aller Kanäle zuzulassen"
 
 #: midi_channel_selector.cc:439
 msgid "Click to disable playback of all channels"
-msgstr ""
+msgstr "Klicke, um Wiedergabe aller Kanäle abzuschalten"
 
 #: midi_channel_selector.cc:444
 msgid "Click to invert current selected playback channels"
 msgstr ""
+"Klicke, um die gegenwärtige Auswahl der wiedergebenden Kanäle zu invertieren"
 
 #: midi_channel_selector.cc:622
 msgid "Click to toggle playback of channel %1"
-msgstr ""
+msgstr "Klicke, um die Wiedergabe von Kanal %1 umzuschalten"
 
 #: midi_channel_selector.cc:630
 msgid "Click to force all MIDI channel messages to channel %1"
-msgstr ""
+msgstr "Klicke, um alle MIDI Channel Messages auf Kanal %1 auszugeben"
 
 #: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
-msgstr ""
+msgstr "Klicke, um die Aufnahme von Kanal %1 umzuschalten"
 
 #: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
-msgstr ""
+msgstr "Klicke, um alle aufgenommenen Kanäle an %1 zu zwingen"
 
 #: midi_export_dialog.cc:35
 msgid "Export MIDI: %1"
@@ -7140,12 +7131,11 @@ msgstr "Modus Externes Gerät"
 
 #: midi_time_axis.cc:271
 msgid "Chns"
-msgstr ""
+msgstr "Chns"
 
 #: midi_time_axis.cc:272
-#, fuzzy
 msgid "Click to edit channel settings"
-msgstr "Hier klicken, um einen Pfad hinzuzufügen"
+msgstr "Klicke, um Kanaleinstellungen zu bearbeiten"
 
 #: midi_time_axis.cc:486
 msgid "Show Full Range"
@@ -7164,9 +7154,8 @@ msgid "Note Mode"
 msgstr "Noten-Modus"
 
 #: midi_time_axis.cc:497
-#, fuzzy
 msgid "Channel Selector"
-msgstr "Kanalfarben"
+msgstr "Kanalauswahl"
 
 #: midi_time_axis.cc:502
 msgid "Color Mode"
@@ -7230,13 +7219,12 @@ msgstr "Spurfarbe"
 
 #: midi_time_axis.cc:1488 midi_time_axis.cc:1494 midi_time_axis.cc:1504
 #: midi_time_axis.cc:1510
-#, fuzzy
 msgid "all"
-msgstr "Klein"
+msgstr "alle"
 
 #: midi_time_axis.cc:1491 midi_time_axis.cc:1507
 msgid "some"
-msgstr ""
+msgstr "einige"
 
 #: midi_tracer.cc:43
 msgid "Line history: "
@@ -7394,20 +7382,20 @@ msgstr "Mixer-Tastenkürzel aus %1 geladen"
 msgid "Could not find mixer.bindings in search path %1"
 msgstr "Konnte mixer.bindings im Suchpfad %1 nicht finden"
 
-#: mixer_strip.cc:91 mixer_strip.cc:119 mixer_strip.cc:1720
+#: mixer_strip.cc:93 mixer_strip.cc:121 mixer_strip.cc:1721
 msgid "pre"
 msgstr "Pre"
 
-#: mixer_strip.cc:93 mixer_strip.cc:121 mixer_strip.cc:352 mixer_strip.cc:1293
+#: mixer_strip.cc:95 mixer_strip.cc:123 mixer_strip.cc:354 mixer_strip.cc:1300
 #: rc_option_editor.cc:1873
 msgid "Comments"
 msgstr "Kommentare"
 
-#: mixer_strip.cc:145
+#: mixer_strip.cc:147
 msgid "Click to toggle the width of this mixer strip."
 msgstr "Klicken Sie, um die Breite des Mixerkanals umzuschalten"
 
-#: mixer_strip.cc:147
+#: mixer_strip.cc:149
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
@@ -7415,59 +7403,59 @@ msgstr ""
 "\n"
 "%1-%2-Klicken Sie, um die Breite aller Mixerkanäle umzuschalten."
 
-#: mixer_strip.cc:154
+#: mixer_strip.cc:156
 msgid "Hide this mixer strip"
 msgstr "Diesen Mixerkanal verbergen"
 
-#: mixer_strip.cc:165
+#: mixer_strip.cc:167
 msgid "Click to select metering point"
 msgstr "Abgreifpunkt der Pegelanzeige auswählen"
 
-#: mixer_strip.cc:171
+#: mixer_strip.cc:173
 msgid "tupni"
 msgstr "tupni"
 
-#: mixer_strip.cc:190
+#: mixer_strip.cc:192
 msgid "Isolate Solo"
 msgstr "Solo isolieren"
 
-#: mixer_strip.cc:199
+#: mixer_strip.cc:201
 msgid "Lock Solo Status"
 msgstr "Solostatus sperren"
 
-#: mixer_strip.cc:201 mixer_strip.cc:1929
+#: mixer_strip.cc:203 mixer_strip.cc:1926
 msgid "lock"
 msgstr "lock"
 
-#: mixer_strip.cc:202 mixer_strip.cc:1928
+#: mixer_strip.cc:204 mixer_strip.cc:1925
 msgid "iso"
 msgstr "iso"
 
-#: mixer_strip.cc:256
+#: mixer_strip.cc:258
 msgid "Mix group"
 msgstr "Bearbeitungsgruppe"
 
-#: mixer_strip.cc:349 rc_option_editor.cc:1870
+#: mixer_strip.cc:351 rc_option_editor.cc:1870
 msgid "Phase Invert"
 msgstr "Phaseninvertierung"
 
-#: mixer_strip.cc:350 rc_option_editor.cc:1871 route_ui.cc:1213
+#: mixer_strip.cc:352 rc_option_editor.cc:1871 route_ui.cc:1218
 msgid "Solo Safe"
 msgstr "Solo sperren"
 
-#: mixer_strip.cc:353 mixer_ui.cc:124 route_time_axis.cc:664
+#: mixer_strip.cc:355 mixer_ui.cc:124 route_time_axis.cc:673
 msgid "Group"
 msgstr "Gruppe"
 
-#: mixer_strip.cc:354 rc_option_editor.cc:1874
+#: mixer_strip.cc:356 rc_option_editor.cc:1874
 msgid "Meter Point"
 msgstr "Abgreifpunkt der Pegelanzeige"
 
-#: mixer_strip.cc:466
+#: mixer_strip.cc:470
 msgid "Enable/Disable MIDI input"
 msgstr "Aktiviert/Deaktiviert MIDI Input"
 
-#: mixer_strip.cc:616
+#: mixer_strip.cc:622
 msgid ""
 "Aux\n"
 "Sends"
@@ -7475,139 +7463,151 @@ msgstr ""
 "Aux\n"
 "Sends"
 
-#: mixer_strip.cc:640
+#: mixer_strip.cc:646
 msgid "Snd"
 msgstr "Snd"
 
-#: mixer_strip.cc:694 mixer_strip.cc:822 processor_box.cc:2152
+#: mixer_strip.cc:701 mixer_strip.cc:829 processor_box.cc:2154
 msgid "Not connected to JACK - no I/O changes are possible"
 msgstr ""
 "Nicht mit Jack verbunden - es sind keine Änderungen an Ein-/Ausgängen möglich"
 
-#: mixer_strip.cc:1089
+#: mixer_strip.cc:1096
 msgid "<b>INPUT</b> to %1"
 msgstr "<b>EINGANG</b> zu %1"
 
-#: mixer_strip.cc:1092
+#: mixer_strip.cc:1099
 msgid "<b>OUTPUT</b> from %1"
 msgstr "<b>AUSGANG</b> von %1"
 
-#: mixer_strip.cc:1167
+#: mixer_strip.cc:1174
 msgid "Disconnected"
 msgstr "Getrennt"
 
-#: mixer_strip.cc:1296
+#: mixer_strip.cc:1303
 msgid "*Comments*"
 msgstr "*Kommentare*"
 
-#: mixer_strip.cc:1303
+#: mixer_strip.cc:1310
 msgid "Cmt"
 msgstr "Kmt"
 
-#: mixer_strip.cc:1306
+#: mixer_strip.cc:1313
 msgid "*Cmt*"
 msgstr "*Kmt*"
 
-#: mixer_strip.cc:1312
+#: mixer_strip.cc:1319
 msgid "Click to Add/Edit Comments"
 msgstr "Kommentare hinzufügen/ändern"
 
-#: mixer_strip.cc:1351
+#: mixer_strip.cc:1358
 msgid ": comment editor"
 msgstr ": Kommentare bearbeiten"
 
-#: mixer_strip.cc:1428
+#: mixer_strip.cc:1435
 msgid "Grp"
 msgstr "Grp"
 
-#: mixer_strip.cc:1431
+#: mixer_strip.cc:1438
 msgid "~G"
 msgstr "~G"
 
-#: mixer_strip.cc:1460
+#: mixer_strip.cc:1467
 msgid "Comments..."
 msgstr "Kommentare"
 
-#: mixer_strip.cc:1462
+#: mixer_strip.cc:1469
 msgid "Save As Template..."
 msgstr "Als Vorlage Speichern..."
 
-#: mixer_strip.cc:1468 route_group_dialog.cc:39 route_time_axis.cc:687
+#: mixer_strip.cc:1475 route_group_dialog.cc:39 route_time_axis.cc:696
 msgid "Active"
 msgstr "Aktiv"
 
-#: mixer_strip.cc:1475
+#: mixer_strip.cc:1482
 msgid "Adjust Latency..."
 msgstr "Latenz einstellen..."
 
-#: mixer_strip.cc:1478
+#: mixer_strip.cc:1485
 msgid "Protect Against Denormals"
 msgstr "Schütze vor Denormals"
 
-#: mixer_strip.cc:1484 route_time_axis.cc:426
+#: mixer_strip.cc:1491 route_time_axis.cc:435
 msgid "Remote Control ID..."
 msgstr "ID für Fernsteuerung..."
 
-#: mixer_strip.cc:1716 mixer_strip.cc:1740
+#: mixer_strip.cc:1717 mixer_strip.cc:1741
 msgid "in"
 msgstr "in"
 
-#: mixer_strip.cc:1724
+#: mixer_strip.cc:1725
 msgid "post"
 msgstr "Post"
 
-#: mixer_strip.cc:1728
+#: mixer_strip.cc:1729
 msgid "out"
 msgstr "out"
 
-#: mixer_strip.cc:1733
+#: mixer_strip.cc:1734
 msgid "custom"
 msgstr "Benutzerdefiniert"
 
-#: mixer_strip.cc:1744
+#: mixer_strip.cc:1745
 msgid "pr"
 msgstr "Pre"
 
-#: mixer_strip.cc:1748
+#: mixer_strip.cc:1749
 msgid "po"
 msgstr "Po"
 
-#: mixer_strip.cc:1752
+#: mixer_strip.cc:1753
 msgid "o"
 msgstr "an"
 
-#: mixer_strip.cc:1757
+#: mixer_strip.cc:1758
 msgid "c"
 msgstr "c"
 
-#: mixer_strip.cc:1905 route_ui.cc:138
+#: mixer_strip.cc:1906 route_ui.cc:143
 msgid "Disk"
 msgstr "Disk"
 
-#: mixer_strip.cc:1920 monitor_section.cc:63
+#: mixer_strip.cc:1918 monitor_section.cc:63
 msgid "AFL"
 msgstr "AFL"
 
-#: mixer_strip.cc:1923 monitor_section.cc:64
+#: mixer_strip.cc:1921 monitor_section.cc:64
 msgid "PFL"
 msgstr "PFL"
 
-#: mixer_strip.cc:1936
+#: mixer_strip.cc:1933
 msgid "D"
 msgstr "D"
 
-#: mixer_strip.cc:1959
+#: mixer_strip.cc:1953
 msgid "i"
 msgstr "i"
 
-#: mixer_strip.cc:2133
+#: mixer_strip.cc:2128
 msgid "Pre-fader"
 msgstr "Pre-Fader"
 
-#: mixer_strip.cc:2134
+#: mixer_strip.cc:2129
 msgid "Post-fader"
 msgstr "Post-Fader"
 
+#: mixer_strip.cc:2166 meter_strip.cc:688
+msgid "Change all in Group to %1"
+msgstr "Alle in Gruppe zu %1 ändern"
+
+#: mixer_strip.cc:2168 meter_strip.cc:690
+msgid "Change all to %1"
+msgstr "Alle zu %1 ändern"
+
+#: mixer_strip.cc:2170 meter_strip.cc:692
+msgid "Change same track-type to %1"
+msgstr "Gleichen Spurtyp zu %1 ändern"
+
 #: mixer_ui.cc:1189
 msgid "track display list item for renamed strip not found!"
 msgstr ""
@@ -7617,10 +7617,46 @@ msgstr ""
 msgid "-all-"
 msgstr "-alle-"
 
-#: mixer_ui.cc:1792
+#: mixer_ui.cc:1794
 msgid "Strips"
 msgstr "Spur"
 
+#: meter_patterns.cc:81
+msgid "Peak"
+msgstr "Spitzenwert"
+
+#: meter_patterns.cc:84
+msgid "RMS + Peak"
+msgstr "RMS + Spitzenwert"
+
+#: meter_patterns.cc:87
+msgid "IEC1/DIN"
+msgstr "IEC1/DIN"
+
+#: meter_patterns.cc:90
+msgid "IEC1/Nordic"
+msgstr "IEC1/Nordisch"
+
+#: meter_patterns.cc:93
+msgid "IEC2/BBC"
+msgstr "IEC2/BBC"
+
+#: meter_patterns.cc:96
+msgid "IEC2/EBU"
+msgstr "IEC2/EBU"
+
+#: meter_patterns.cc:99
+msgid "K20"
+msgstr "K20"
+
+#: meter_patterns.cc:102
+msgid "K14"
+msgstr "K14"
+
+#: meter_patterns.cc:105
+msgid "VU"
+msgstr "VU"
+
 #: monitor_section.cc:62
 msgid "SiP"
 msgstr "SiP"
@@ -7922,6 +7958,8 @@ msgstr "  -h, --help                       Diese Hinweise ausgeben\n"
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr ""
+"  -a, --no-announcements      Webseite nicht wegen Verlautbarungen "
+"kontaktieren"
 
 #: opts.cc:62
 msgid ""
@@ -7976,7 +8014,7 @@ msgstr ""
 
 #: opts.cc:70
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
-msgstr ""
+msgstr "  -P, --no-connect-ports      beim Programmstart Ports nicht verbinden"
 
 #: opts.cc:71
 msgid "  -S, --sync                  Draw the gui synchronously \n"
@@ -8010,7 +8048,7 @@ msgstr ""
 msgid "Panner (2D)"
 msgstr "Panner (2D)"
 
-#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:452
+#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:451
 msgid "Bypass"
 msgstr "Bypass"
 
@@ -8186,7 +8224,7 @@ msgstr "Nach Kategorie"
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr "Merkwürdig... LADSPA-Plugins sollten kein GUI haben!"
 
-#: plugin_ui.cc:125 plugin_ui.cc:228
+#: plugin_ui.cc:125 plugin_ui.cc:227
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
@@ -8198,7 +8236,7 @@ msgstr ""
 msgid "unknown type of editor-supplying plugin"
 msgstr "Unbekannter Plugintyp"
 
-#: plugin_ui.cc:258
+#: plugin_ui.cc:257
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
@@ -8206,23 +8244,23 @@ msgstr ""
 "Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
 "unterstützt keine linuxVST-Plugins)"
 
-#: plugin_ui.cc:330
+#: plugin_ui.cc:329
 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:417
 msgid "Add"
 msgstr "Hinzufügen"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:421
 msgid "Description"
 msgstr "Beschreibung:"
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:422
 msgid "Plugin analysis"
 msgstr "Pluginanalyse"
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:429
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
@@ -8230,23 +8268,23 @@ msgstr ""
 "Presets (falls existent) für dieses Plugin\n"
 "(Hersteller- und Benutzerpresets)"
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:430
 msgid "Save a new preset"
 msgstr "Neues Preset speichern"
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:431
 msgid "Save the current preset"
 msgstr "Momentanes Preset speichern"
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:432
 msgid "Delete the current preset"
 msgstr "Lösche das aktuelle Preset"
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:433
 msgid "Disable signal processing by the plugin"
 msgstr "Deaktiviere die Signalverarbeitung des Plugins"
 
-#: plugin_ui.cc:467 plugin_ui.cc:632
+#: plugin_ui.cc:466 plugin_ui.cc:662
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
@@ -8254,29 +8292,45 @@ msgstr ""
 "Klicke, damit das Plugin Tastaturbefehle erhält, die %1 sonst als "
 "Tastenkürzel verwenden würde"
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:467
 msgid "Click to enable/disable this plugin"
 msgstr "Klicke, um dieses Plugin zu ein/auszuschalten"
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:506
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] "Latenz (%1 Sample)"
 msgstr[1] "Latenz (%1 Samples)"
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:508
 msgid "latency (%1 ms)"
 msgstr "Latenz (%1 ms)"
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:519
 msgid "Edit Latency"
 msgstr "Latenz bearbeiten"
 
-#: plugin_ui.cc:559
+#: plugin_ui.cc:558
 msgid "Plugin preset %1 not found"
 msgstr "Plugin Preset %1 nicht gefunden"
 
-#: plugin_ui.cc:639
+#: plugin_ui.cc:595
+msgid ""
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"full version"
+msgstr ""
+"Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen "
+"Sie, für eine Vollversion zu zahlen"
+
+#: plugin_ui.cc:615 plugin_ui.cc:630
+msgid ""
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"newer version"
+msgstr ""
+"Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen "
+"Sie, für eine neuere Version zu zahlen"
+
+#: plugin_ui.cc:669
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr "Klicke, um die normale Verwendung von %1 Tastenkürzeln zu aktivieren"
 
@@ -8380,62 +8434,62 @@ msgstr "Messe..."
 msgid "Port Insert "
 msgstr "Port Insert "
 
-#: port_matrix.cc:323 port_matrix.cc:342
+#: port_matrix.cc:325 port_matrix.cc:344
 msgid "<b>Sources</b>"
 msgstr "<b>Quellen</b>"
 
-#: port_matrix.cc:324 port_matrix.cc:343
+#: port_matrix.cc:326 port_matrix.cc:345
 msgid "<b>Destinations</b>"
 msgstr "<b>Ziele</b>"
 
-#: port_matrix.cc:419 port_matrix.cc:427
+#: port_matrix.cc:421 port_matrix.cc:429
 #, c-format
 msgid "Add %s %s"
 msgstr "Füge %s %s hinzu"
 
-#: port_matrix.cc:435
+#: port_matrix.cc:437
 #, c-format
 msgid "Rename '%s'..."
 msgstr "Benenne '%s' um..."
 
-#: port_matrix.cc:451
+#: port_matrix.cc:453
 msgid "Remove all"
 msgstr "Alle löschen"
 
-#: port_matrix.cc:471 port_matrix.cc:483
+#: port_matrix.cc:473 port_matrix.cc:485
 #, c-format
 msgid "%s all"
 msgstr "%s alle"
 
-#: port_matrix.cc:506
+#: port_matrix.cc:508
 msgid "Rescan"
 msgstr "Aktualisieren"
 
-#: port_matrix.cc:508
+#: port_matrix.cc:510
 msgid "Show individual ports"
 msgstr "Individuelle Ports anzeigen"
 
-#: port_matrix.cc:514
+#: port_matrix.cc:516
 msgid "Flip"
 msgstr "Drehen"
 
-#: port_matrix.cc:702
+#: port_matrix.cc:704
 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 das erste Plugin der Spur/des "
+"Hier kann kein Port hinzugefügt werden, da der erste Prozessor der Spur/des "
 "Busses die neue Portanzahl nicht unterstützt."
 
-#: port_matrix.cc:705
+#: port_matrix.cc:707
 msgid "Cannot add port"
 msgstr "Kann Port nicht hinzufügen"
 
-#: port_matrix.cc:727
+#: port_matrix.cc:729
 msgid "Port removal not allowed"
 msgstr "Entfernen des Ports nicht erlaubt"
 
-#: port_matrix.cc:728
+#: port_matrix.cc:730
 msgid ""
 "This port cannot be removed, as the first plugin in the track or buss cannot "
 "accept the new number of inputs."
@@ -8443,17 +8497,17 @@ msgstr ""
 "Der Port kann nicht entfernt werden, da das erste Plugin der Spur die neue "
 "Portanzahl nicht unterstützt."
 
-#: port_matrix.cc:945
+#: port_matrix.cc:947
 #, c-format
 msgid "Remove '%s'"
 msgstr "Lösche '%s'"
 
-#: port_matrix.cc:960
+#: port_matrix.cc:962
 #, c-format
 msgid "%s all from '%s'"
 msgstr "alle von '%s' %s"
 
-#: port_matrix.cc:1026
+#: port_matrix.cc:1028
 msgid "channel"
 msgstr "Kanal"
 
@@ -8465,36 +8519,41 @@ 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:255
+#: processor_box.cc:256
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
 "Alt+double-click to show generic GUI."
 msgstr ""
+"<b>%1</b>\n"
+"Doppelklick, um GUI zu zeigen.\n"
+"Alt-Doppelklick, um einfaches GUI zu zeigen."
 
-#: processor_box.cc:258
+#: processor_box.cc:259
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI."
 msgstr ""
+"<b>%1</b>\n"
+"Alt-Doppelklick, um einfaches GUI zu zeigen."
 
-#: processor_box.cc:371
+#: processor_box.cc:372
 msgid "Show All Controls"
 msgstr "Alle Regler zeigen"
 
-#: processor_box.cc:375
+#: processor_box.cc:376
 msgid "Hide All Controls"
 msgstr "Alle Regler verbergen"
 
-#: processor_box.cc:464
+#: processor_box.cc:465
 msgid "on"
 msgstr "an"
 
-#: processor_box.cc:464 rc_option_editor.cc:1903 rc_option_editor.cc:1917
+#: processor_box.cc:465 rc_option_editor.cc:1903 rc_option_editor.cc:1917
 msgid "off"
 msgstr "Aus"
 
-#: processor_box.cc:729
+#: processor_box.cc:742
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
@@ -8502,15 +8561,15 @@ msgstr ""
 "Rechtsklick, um Plugins, Inserts, Sends etc.\n"
 "hinzuzufügen/zu editieren/zu löschen"
 
-#: processor_box.cc:1184 processor_box.cc:1578
+#: processor_box.cc:1197 processor_box.cc:1591
 msgid "Plugin Incompatibility"
 msgstr "Plugin-Inkompatibilität"
 
-#: processor_box.cc:1187
+#: processor_box.cc:1200
 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:1193
+#: processor_box.cc:1206
 msgid ""
 "\n"
 "This plugin has:\n"
@@ -8518,19 +8577,19 @@ msgstr ""
 "\n"
 "Dieses Plugin hat:\n"
 
-#: processor_box.cc:1196
+#: processor_box.cc:1209
 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:1200
+#: processor_box.cc:1213
 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:1203
+#: processor_box.cc:1216
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
@@ -8538,19 +8597,19 @@ msgstr ""
 "\n"
 "aber am Einfügepunkt gibt es:\n"
 
-#: processor_box.cc:1206
+#: processor_box.cc:1219
 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:1210
+#: processor_box.cc:1223
 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:1213
+#: processor_box.cc:1226
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
@@ -8558,11 +8617,11 @@ msgstr ""
 "\n"
 "%1 kann dieses Plugin hier nicht einfügen.\n"
 
-#: processor_box.cc:1249
+#: processor_box.cc:1262
 msgid "Cannot set up new send: %1"
 msgstr "Kann keinen neuen Send erstellen: %1"
 
-#: processor_box.cc:1581
+#: processor_box.cc:1594
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
@@ -8572,21 +8631,21 @@ msgstr ""
 "nicht auf diese Weise verändern, sonst würden\n"
 "die Ein-/Ausgänge nicht mehr richtig funktionieren."
 
-#: processor_box.cc:1765
+#: processor_box.cc:1778
 msgid "Rename Processor"
 msgstr "Prozessor umbenennen"
 
-#: processor_box.cc:1796
+#: processor_box.cc:1809
 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:1930
+#: processor_box.cc:1943
 msgid "plugin insert constructor failed"
 msgstr "Einfügen des Plugins gescheitert"
 
-#: processor_box.cc:1941
+#: processor_box.cc:1954
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
@@ -8596,84 +8655,83 @@ msgstr ""
 "kopieren, vermutlich weil die E/A Konfiguration der Plugins\n"
 "nicht mit der dieser Spur übereinstimmt."
 
-#: processor_box.cc:1987
+#: processor_box.cc:2000
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
-"Wollen Sie wirklich alle Redirects von %1 entfernen?\n"
+"Wollen Sie wirklich alle Prozessoren von %1 entfernen?\n"
 "(Dies kann nicht rückgängig gemacht werden)"
 
-#: processor_box.cc:1991 processor_box.cc:2016
+#: processor_box.cc:2004 processor_box.cc:2029
 msgid "Yes, remove them all"
 msgstr "Ja, alle löschen"
 
-#: processor_box.cc:1993 processor_box.cc:2018
+#: processor_box.cc:2006 processor_box.cc:2031
 msgid "Remove processors"
 msgstr "Prozessoren entfernen"
 
-#: processor_box.cc:2008
+#: processor_box.cc:2021
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
-"Wollen Sie wirklich alle Pre-Fader-Redirects von %1 entfernen?\n"
+"Wollen Sie wirklich alle Pre-Fader-Prozessoren von %1 entfernen?\n"
 "(Dies kann nicht rückgängig gemacht werden)"
 
-#: processor_box.cc:2011
+#: processor_box.cc:2024
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
-"Wollen Sie wirklich alle Post-Fader-Redirects von %1 entfernen?\n"
+"Wollen Sie wirklich alle Post-Fader-Prozessoren von %1 entfernen?\n"
 "(Dies kann nicht rückgängig gemacht werden)"
 
-#: processor_box.cc:2198
+#: processor_box.cc:2200
 msgid "New Plugin"
 msgstr "Plugin einfügen"
 
-#: processor_box.cc:2201
+#: processor_box.cc:2203
 msgid "New Insert"
 msgstr "Insert einfügen"
 
-#: processor_box.cc:2204
+#: processor_box.cc:2206
 msgid "New External Send ..."
 msgstr "Neuer externer Send..."
 
-#: processor_box.cc:2208
+#: processor_box.cc:2210
 msgid "New Aux Send ..."
 msgstr "Neuer Aux-Send..."
 
-#: processor_box.cc:2212
+#: processor_box.cc:2214
 msgid "Clear (all)"
 msgstr "Leeren (alle)"
 
-#: processor_box.cc:2214
+#: processor_box.cc:2216
 msgid "Clear (pre-fader)"
 msgstr "Leeren (Pre-Fader)"
 
-#: processor_box.cc:2216
+#: processor_box.cc:2218
 msgid "Clear (post-fader)"
 msgstr "Leeren (Post-Fader)"
 
-#: processor_box.cc:2242
+#: processor_box.cc:2244
 msgid "Activate All"
 msgstr "Alle aktivieren"
 
-#: processor_box.cc:2244
+#: processor_box.cc:2246
 msgid "Deactivate All"
 msgstr "Alle deaktivieren"
 
-#: processor_box.cc:2246
+#: processor_box.cc:2248
 msgid "A/B Plugins"
 msgstr "A/B Plugins"
 
-#: processor_box.cc:2255
-#, fuzzy
+#: processor_box.cc:2257
 msgid "Edit with generic controls..."
 msgstr "Mit einfachen Kontrollelementen editieren..."
 
-#: processor_box.cc:2531
+#: processor_box.cc:2557
 msgid "%1: %2 (by %3)"
 msgstr "%1: %2 (by %3)"
 
@@ -8763,7 +8821,7 @@ msgstr "Bearbeiten mit:"
 
 #: rc_option_editor.cc:321 rc_option_editor.cc:347 rc_option_editor.cc:374
 msgid "+ button"
-msgstr "und Maustaste"
+msgstr "+ Maustaste"
 
 #: rc_option_editor.cc:341
 msgid "Delete using:"
@@ -8794,9 +8852,8 @@ msgid "Recording (seconds of buffering):"
 msgstr "Aufnahme (gepufferte Sekunden):"
 
 #: rc_option_editor.cc:656
-#, fuzzy
 msgid "Control Surface Protocol"
-msgstr "Eingabegeräte / Controller"
+msgstr "Eingabegeräteprotokoll"
 
 #: rc_option_editor.cc:660
 msgid "Feedback"
@@ -8810,37 +8867,42 @@ msgstr ""
 
 #: rc_option_editor.cc:817
 msgid "Show Video Export Info before export"
-msgstr ""
+msgstr "Zeige Video-Exportinformationen vor dem Exportieren"
 
 #: rc_option_editor.cc:818
 msgid "Show Video Server Startup Dialog"
-msgstr ""
+msgstr "Zeige den Videoserver-Startdialog"
 
 #: rc_option_editor.cc:819
 msgid "Advanced Setup (remote video server)"
-msgstr ""
+msgstr "Ausführliche Einrichtung (entfernter Videoserver)"
 
 #: rc_option_editor.cc:827
 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>Wenn aktiviert</b>, können Sie eine benutzerdefinierte URL und docroot "
+"für den Videoserver eingeben. - Aktivieren Sie diese Option nur, wenn Sie "
+"wissen, was Sie tun."
 
 #: rc_option_editor.cc:829
 msgid "Video Server URL:"
-msgstr ""
+msgstr "Videoserver URL:"
 
 #: rc_option_editor.cc:834
 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 runing locally"
+"the video-server is running locally"
 msgstr ""
+"Basis-URL des Videoservers mit http-Prefix. Dies ist normalerweise 'http://"
+"hostname.example.org:1554/' und ist auf 'http://localhost:1554/' "
+"voreingestellt, wenn der Videoserver lokal läuft"
 
 #: rc_option_editor.cc:836
-#, fuzzy
 msgid "Video Folder:"
-msgstr "Ordner:"
+msgstr "Videoordner:"
 
 #: rc_option_editor.cc:841
 msgid ""
@@ -8850,18 +8912,27 @@ msgid ""
 "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 ""
+"Lokaler Pfad zum document-root des Videoservers. Nur Dateien unterhalb "
+"dieses Verzeichnisses sind dem Videoserver zugänglich.Falls der Server auf "
+"einem entfernten Rechner läuft, sollte der Pfad auf ein im Netzwerk "
+"gemountetes Verzeichnis der docroot des Servers verweisen, oder leergelassen "
+"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:848
 msgid ""
 "<b>When enabled</b> an information window with details is displayed before "
 "the video-export dialog."
 msgstr ""
+"<b>Wenn aktiviert</b> , wird vor dem Videoexport-Dialog ein "
+"Informationsfenster mit Details angezeigt."
 
 #: rc_option_editor.cc:853
 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:993
 msgid "%1 Preferences"
@@ -8885,7 +8956,7 @@ msgstr "Alle verfügbaren Prozessoren"
 
 #: rc_option_editor.cc:1017
 msgid "%1 processors"
-msgstr "%1 Prozessor(en)"
+msgstr "%1 Prozessoren"
 
 #: rc_option_editor.cc:1020
 msgid "This setting will only take effect when %1 is restarted."
@@ -8923,7 +8994,7 @@ msgstr "Maximale Anzahl kürzlich geöffneter Projekte"
 msgid "Click gain level"
 msgstr "Lautstärke für Klick"
 
-#: rc_option_editor.cc:1083 route_time_axis.cc:206 route_time_axis.cc:667
+#: rc_option_editor.cc:1083 route_time_axis.cc:215 route_time_axis.cc:676
 msgid "Automation"
 msgstr "Automationen"
 
@@ -9311,7 +9382,7 @@ msgstr "Umgang des Prozessors mit Denormals"
 
 #: rc_option_editor.cc:1532
 msgid "no processor handling"
-msgstr "Keine Korrekturen"
+msgstr "nicht behandeln"
 
 #: rc_option_editor.cc:1537
 msgid "use FlushToZero"
@@ -9375,11 +9446,11 @@ msgstr "Abgreifpunkt der PFL Signale"
 
 #: rc_option_editor.cc:1622
 msgid "before pre-fader processors"
-msgstr "Vor den Pre-Fader Effekten"
+msgstr "Vor den Pre-Fader Prozessoren"
 
 #: rc_option_editor.cc:1623
 msgid "pre-fader but after pre-fader processors"
-msgstr "Pre-Fader, aber nach den Effekten"
+msgstr "Pre-Fader, aber nach den Prozessoren"
 
 #: rc_option_editor.cc:1629
 msgid "AFL signals come from"
@@ -9391,7 +9462,7 @@ msgstr "Direkt nach dem Fader"
 
 #: rc_option_editor.cc:1635
 msgid "after post-fader processors (before pan)"
-msgstr "Nach den Post-Fader Effekten (vor Pan)"
+msgstr "Nach den Post-Fader Prozessoren (vor Pan)"
 
 #: rc_option_editor.cc:1644
 msgid "Exclusive solo"
@@ -9507,10 +9578,11 @@ msgstr "folgt Reihenfolge im Editor"
 
 #: rc_option_editor.cc:1838 rc_option_editor.cc:1846 rc_option_editor.cc:1856
 #: rc_option_editor.cc:1877 rc_option_editor.cc:1886 rc_option_editor.cc:1894
-#: rc_option_editor.cc:1908 rc_option_editor.cc:1925
-#, fuzzy
+#: rc_option_editor.cc:1908 rc_option_editor.cc:1927 rc_option_editor.cc:1943
+#: rc_option_editor.cc:1959 rc_option_editor.cc:1973 rc_option_editor.cc:1987
+#: rc_option_editor.cc:1989
 msgid "Preferences|GUI"
-msgstr "Globale Einstellungen"
+msgstr "GUI"
 
 #: rc_option_editor.cc:1841
 msgid "Graphically indicate mouse pointer hovering over various widgets"
@@ -9537,14 +9609,14 @@ msgid "Use narrow strips in the mixer by default"
 msgstr "Standardmäßig schmale Mixer-Kanalzüge verwenden"
 
 #: rc_option_editor.cc:1898
-msgid "Meter hold time"
-msgstr "Pegelanzeige halten"
+msgid "Peak hold time"
+msgstr "Haltezeit für Spitzenwert"
 
 #: rc_option_editor.cc:1904
 msgid "short"
 msgstr "Kurz"
 
-#: rc_option_editor.cc:1905 rc_option_editor.cc:1920
+#: rc_option_editor.cc:1905
 msgid "medium"
 msgstr "Mittel"
 
@@ -9553,28 +9625,112 @@ msgid "long"
 msgstr "Lange"
 
 #: rc_option_editor.cc:1912
-msgid "Meter fall-off"
-msgstr "Abfall der Pegelanzeige"
+msgid "DPM fall-off"
+msgstr "Abfall der digitalen Pegelanzeige"
 
 #: rc_option_editor.cc:1918
-msgid "slowest"
-msgstr "Am langsamstem"
+msgid "slowest [6.6dB/sec]"
+msgstr "am langsamsten [6.6dB/sec]"
 
 #: rc_option_editor.cc:1919
-msgid "slow"
-msgstr "Langsam"
+msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
+msgstr "langsam [8.6dB/sec] (BBC PPM, EBU PPM)"
+
+#: rc_option_editor.cc:1920
+msgid "slowish [12.0dB/sec] (DIN)"
+msgstr "etwas langsam [12.0dB/sec] (DIN)"
 
 #: rc_option_editor.cc:1921
-msgid "fast"
-msgstr "Schnell"
+msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr "mäßig [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 
 #: rc_option_editor.cc:1922
-msgid "faster"
-msgstr "Schneller"
+msgid "medium [20dB/sec]"
+msgstr "mittel [20dB/sec]"
 
 #: rc_option_editor.cc:1923
-msgid "fastest"
-msgstr "Schnellstmöglich"
+msgid "fast [32dB/sec]"
+msgstr "schnell [32dB/sec]"
+
+#: rc_option_editor.cc:1924
+msgid "faster [46dB/sec]"
+msgstr "schneller [46dB/sec]"
+
+#: rc_option_editor.cc:1925
+msgid "fastest [70dB/sec]"
+msgstr "am schnellsten [70dB/sec]"
+
+#: rc_option_editor.cc:1931
+msgid "Meter line-up level; 0dBu"
+msgstr "Ausrichtung der Pegelanzeige; 0dBu"
+
+#: rc_option_editor.cc:1936 rc_option_editor.cc:1952
+msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
+msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
+
+#: rc_option_editor.cc:1937 rc_option_editor.cc:1953
+msgid "-20dBFS (SMPTE RP.0155)"
+msgstr "-20dBFS (SMPTE RP.0155)"
+
+#: rc_option_editor.cc:1938 rc_option_editor.cc:1954
+msgid "-18dBFS (EBU, BBC)"
+msgstr "-18dBFS (EBU, BBC)"
+
+#: rc_option_editor.cc:1939 rc_option_editor.cc:1955
+msgid "-15dBFS (DIN)"
+msgstr "-15dBFS (DIN)"
+
+#: rc_option_editor.cc:1941
+msgid ""
+"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
+"level for IEC1/Nordic, IEC2 PPM and VU meter."
+msgstr ""
+"Konfiguriere Skalierung und Farbschwellwert für DPM mit dBFS-Skala, setze"
+"Referenzpegel  für IEC1/Nordisch, IEC2 PPM und VU Pegelanzeigen."
+
+#: rc_option_editor.cc:1947
+msgid "IEC1/DIN Meter line-up level; 0dBu"
+msgstr "Ausrichtung der IEC1/DIN Pegelanzeige; 0dBu"
+
+#: rc_option_editor.cc:1957
+msgid "Reference level for IEC1/DIN meter."
+msgstr "Referenzpegel  für IEC1/DIN Pegelanzeige."
+
+#: rc_option_editor.cc:1963
+msgid "VU Meter standard"
+msgstr "Standard für VU-Pegelanzeige"
+
+#: rc_option_editor.cc:1968
+msgid "0VU = -2dBu (France)"
+msgstr "0VU = -2dBu (Frankreich)"
+
+#: rc_option_editor.cc:1969
+msgid "0VU = 0dBu (North America, Australia)"
+msgstr "0VU = 0dBu (Nordamerika, Australien)"
+
+#: rc_option_editor.cc:1970
+msgid "0VU = +4dBu (standard)"
+msgstr "0VU = +4dBu (Standard)"
+
+#: rc_option_editor.cc:1971
+msgid "0VU = +8dBu"
+msgstr "0VU = +8dBu"
+
+#: rc_option_editor.cc:1977
+msgid "Peak threshold [dBFS]"
+msgstr "Schwelle für Spitzenwert [dBFS]"
+
+#: rc_option_editor.cc:1985
+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"
+
+#: rc_option_editor.cc:1992
+msgid "LED meter style"
+msgstr "Pegelanzeigen im LED-Stil"
 
 #: region_editor.cc:79
 msgid "audition this region"
@@ -9588,7 +9744,7 @@ msgstr "Position:"
 msgid "End:"
 msgstr "Ende:"
 
-#: region_editor.cc:92 sfdb_ui.cc:140
+#: region_editor.cc:92 sfdb_ui.cc:141
 msgid "Length:"
 msgstr "Länge:"
 
@@ -9612,23 +9768,23 @@ msgstr "Quellen:"
 msgid "Source:"
 msgstr "Quelle:"
 
-#: region_editor.cc:167
+#: region_editor.cc:166
 msgid "Region '%1'"
 msgstr "Region '%1'"
 
-#: region_editor.cc:274
+#: region_editor.cc:273
 msgid "change region start position"
 msgstr "Startposition der Region ändern"
 
-#: region_editor.cc:290
+#: region_editor.cc:289
 msgid "change region end position"
 msgstr "Endposition der Region ändern"
 
-#: region_editor.cc:310
+#: region_editor.cc:309
 msgid "change region length"
 msgstr "Länge der Region verändern"
 
-#: region_editor.cc:404 region_editor.cc:416
+#: region_editor.cc:403 region_editor.cc:415
 msgid "change region sync point"
 msgstr "Synchronisationspunkt der Region ändern"
 
@@ -9756,7 +9912,7 @@ msgstr "Threshold"
 
 #: rhythm_ferret.cc:128
 msgid "Peak threshold"
-msgstr "Peak threshold"
+msgstr "Schwelle für Spitzenwert"
 
 #: rhythm_ferret.cc:133
 msgid "Silence threshold"
@@ -9821,320 +9977,319 @@ msgstr ""
 "Es gibt bereits eine Bearbeitungsgruppe mit diesem Namen. Bitte wahlen Sie "
 "einen anderen."
 
-#: route_params_ui.cc:82
+#: route_params_ui.cc:83
 msgid "Tracks/Busses"
 msgstr "Spuren/Busse"
 
-#: route_params_ui.cc:101
+#: route_params_ui.cc:102
 msgid "Inputs"
 msgstr "Eingänge"
 
-#: route_params_ui.cc:102
+#: route_params_ui.cc:103
 msgid "Outputs"
 msgstr "Ausgänge"
 
-#: route_params_ui.cc:103
+#: route_params_ui.cc:104
 msgid "Plugins, Inserts & Sends"
 msgstr "Plugins, Inserts & Sends"
 
-#: route_params_ui.cc:211
+#: route_params_ui.cc:208
 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:258 route_params_ui.cc:286
+#: route_params_ui.cc:255 route_params_ui.cc:283
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr "Wiedergabeverzögerung: %<PRId64> Samples"
 
-#: route_params_ui.cc:478
+#: route_params_ui.cc:475
 msgid "NO TRACK"
 msgstr "KEINE SPUR"
 
-#: route_params_ui.cc:611 route_params_ui.cc:612
+#: route_params_ui.cc:613 route_params_ui.cc:614
 msgid "No Track or Bus Selected"
 msgstr "Keine Spuren oder Busse ausgewählt"
 
-#: route_time_axis.cc:96
+#: route_time_axis.cc:97
 msgid "g"
 msgstr "g"
 
-#: route_time_axis.cc:97
+#: route_time_axis.cc:98
 msgid "p"
 msgstr "w"
 
-#: route_time_axis.cc:98
+#: route_time_axis.cc:99
 msgid "a"
 msgstr "a"
 
-#: route_time_axis.cc:168
+#: route_time_axis.cc:173
 msgid "Record (Right-click for Step Edit)"
 msgstr "Aufnahme (Rechtsklick für Step Entry)"
 
-#: route_time_axis.cc:171
+#: route_time_axis.cc:176
 msgid "Record"
 msgstr "Aufnahme"
 
-#: route_time_axis.cc:201
+#: route_time_axis.cc:210
 msgid "Route Group"
 msgstr "Bearbeitungsgruppe"
 
-#: route_time_axis.cc:204
+#: route_time_axis.cc:213
 msgid "MIDI Controllers and Automation"
 msgstr "MIDI-Controller und Automation"
 
-#: route_time_axis.cc:381
+#: route_time_axis.cc:390
 msgid "Show All Automation"
 msgstr "Alle Automationen anzeigen"
 
-#: route_time_axis.cc:384
+#: route_time_axis.cc:393
 msgid "Show Existing Automation"
 msgstr "Genutzte Automationen zeigen"
 
-#: route_time_axis.cc:387
+#: route_time_axis.cc:396
 msgid "Hide All Automation"
 msgstr "Alle Automationen verbergen"
 
-#: route_time_axis.cc:396
-#, fuzzy
+#: route_time_axis.cc:405
 msgid "Processor automation"
-msgstr "Automation zurücksetzen"
+msgstr "Prozessorautomation"
 
-#: route_time_axis.cc:415
+#: route_time_axis.cc:424
 msgid "Color..."
 msgstr "Farbe..."
 
-#: route_time_axis.cc:472
+#: route_time_axis.cc:481
 msgid "Overlaid"
 msgstr "Overlaid"
 
-#: route_time_axis.cc:478
+#: route_time_axis.cc:487
 msgid "Stacked"
 msgstr "Stacked"
 
-#: route_time_axis.cc:486
+#: route_time_axis.cc:495
 msgid "Layers"
 msgstr "Layers"
 
-#: route_time_axis.cc:555
+#: route_time_axis.cc:564
 msgid "Automatic (based on I/O connections)"
 msgstr "Automatisch (auf den I/O Verbindungen basierend)"
 
-#: route_time_axis.cc:564
+#: route_time_axis.cc:573
 msgid "(Currently: Existing Material)"
 msgstr "(Momentan: An vorhandenem Material ausrichten)"
 
-#: route_time_axis.cc:567
+#: route_time_axis.cc:576
 msgid "(Currently: Capture Time)"
 msgstr "(Momentan: An Aufnahmezeit ausrichten)"
 
-#: route_time_axis.cc:575
+#: route_time_axis.cc:584
 msgid "Align With Existing Material"
 msgstr "An vorhandenem Material ausrichten"
 
-#: route_time_axis.cc:580
+#: route_time_axis.cc:589
 msgid "Align With Capture Time"
 msgstr "An Aufnahmezeit ausrichten"
 
-#: route_time_axis.cc:585
+#: route_time_axis.cc:594
 msgid "Alignment"
 msgstr "Ausrichtung"
 
-#: route_time_axis.cc:620
+#: route_time_axis.cc:629
 msgid "Normal Mode"
 msgstr "Normaler Modus"
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:635
 msgid "Tape Mode"
 msgstr "Band-Modus"
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:641
 msgid "Non-Layered Mode"
 msgstr "Non-Layered Mode"
 
-#: route_time_axis.cc:645 route_time_axis.cc:1587
+#: route_time_axis.cc:654 route_time_axis.cc:1601
 msgid "Playlist"
 msgstr "Wiedergabeliste"
 
-#: route_time_axis.cc:965
+#: route_time_axis.cc:979
 msgid "Rename Playlist"
 msgstr "Wiedergabeliste umbenennen"
 
-#: route_time_axis.cc:966
+#: route_time_axis.cc:980
 msgid "New name for playlist:"
 msgstr "Neuer Name für Wiedergabeliste:"
 
-#: route_time_axis.cc:1051
+#: route_time_axis.cc:1065
 msgid "New Copy Playlist"
 msgstr "Neue Kopie der Wiedergabeliste"
 
-#: route_time_axis.cc:1052 route_time_axis.cc:1105
+#: route_time_axis.cc:1066 route_time_axis.cc:1119
 msgid "Name for new playlist:"
 msgstr "Name für die neue Wiedergabeliste:"
 
-#: route_time_axis.cc:1104
+#: route_time_axis.cc:1118
 msgid "New Playlist"
 msgstr "Neue Wiedergabeliste"
 
-#: route_time_axis.cc:1295
+#: route_time_axis.cc:1309
 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:1476
+#: route_time_axis.cc:1490
 msgid "New Copy..."
 msgstr "Neue Kopie..."
 
-#: route_time_axis.cc:1480
+#: route_time_axis.cc:1494
 msgid "New Take"
 msgstr "Neuer Take"
 
-#: route_time_axis.cc:1481
+#: route_time_axis.cc:1495
 msgid "Copy Take"
 msgstr "Take kopieren"
 
-#: route_time_axis.cc:1486
+#: route_time_axis.cc:1500
 msgid "Clear Current"
 msgstr "Aktuelle leeren"
 
-#: route_time_axis.cc:1489
+#: route_time_axis.cc:1503
 msgid "Select From All..."
 msgstr "Aus allen auswählen..."
 
-#: route_time_axis.cc:1577
+#: route_time_axis.cc:1591
 msgid "Take: %1.%2"
 msgstr "Take: %1.%2"
 
-#: route_time_axis.cc:2267
+#: route_time_axis.cc:2291
 msgid "Underlays"
 msgstr "Darunterliegende"
 
-#: route_time_axis.cc:2270
+#: route_time_axis.cc:2294
 msgid "Remove \"%1\""
 msgstr "Lösche \"%1\""
 
-#: route_time_axis.cc:2320 route_time_axis.cc:2357
+#: route_time_axis.cc:2344 route_time_axis.cc:2381
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr "programming error: underlay reference pointer pairs are inconsistent!"
 
-#: route_time_axis.cc:2388
+#: route_time_axis.cc:2408
 msgid "After-fade listen (AFL)"
 msgstr "After-Fader (AFL)"
 
-#: route_time_axis.cc:2392
+#: route_time_axis.cc:2412
 msgid "Pre-fade listen (PFL)"
 msgstr "Pre-Fader (PFL)"
 
-#: route_time_axis.cc:2396
+#: route_time_axis.cc:2416
 msgid "s"
 msgstr "s"
 
-#: route_time_axis.cc:2400
+#: route_time_axis.cc:2419
 msgid "m"
 msgstr "m"
 
-#: route_ui.cc:114
+#: route_ui.cc:119
 msgid "Mute this track"
 msgstr "Diese Spur stummschalten"
 
-#: route_ui.cc:118
+#: route_ui.cc:123
 msgid "Mute other (non-soloed) tracks"
 msgstr "Andere (nicht Solo-)Spuren stummschalten"
 
-#: route_ui.cc:124
+#: route_ui.cc:129
 msgid "Enable recording on this track"
 msgstr "Aktiviere die Aufnahme auf dieser Spur"
 
-#: route_ui.cc:128
+#: route_ui.cc:133
 msgid "make mixer strips show sends to this bus"
 msgstr "Channel strips zeigen Sends zu diesem Bus"
 
-#: route_ui.cc:133
+#: route_ui.cc:138
 msgid "Monitor input"
 msgstr "Eingang abhören"
 
-#: route_ui.cc:139
+#: route_ui.cc:144
 msgid "Monitor playback"
 msgstr "Vorhandenes Material abhören"
 
-#: route_ui.cc:586
+#: route_ui.cc:591
 msgid "Not connected to JACK - cannot engage record"
 msgstr "Nicht mit JACK verbunden - konnte die Aufnahme nicht starten"
 
-#: route_ui.cc:781
+#: route_ui.cc:786
 msgid "Step Entry"
 msgstr "Eingabemodus (Step Entry)"
 
-#: route_ui.cc:854
+#: route_ui.cc:859
 msgid "Assign all tracks (prefader)"
 msgstr "Alle Audiospuren zuweisen (Pre-Fader)"
 
-#: route_ui.cc:858
+#: route_ui.cc:863
 msgid "Assign all tracks and buses (prefader)"
 msgstr "Alle Audiospuren und Busse zuweisen (Pre-Fader)"
 
-#: route_ui.cc:862
+#: route_ui.cc:867
 msgid "Assign all tracks (postfader)"
 msgstr "Alle Audiospuren zuweisen (Post-Fader)"
 
-#: route_ui.cc:866
+#: route_ui.cc:871
 msgid "Assign all tracks and buses (postfader)"
 msgstr "Alle Audiospuren und Busse zuweisen (Post-Fader)"
 
-#: route_ui.cc:870
+#: route_ui.cc:875
 msgid "Assign selected tracks (prefader)"
 msgstr "Ausgewählte Audiospuren zuweisen (Pre-Fader)"
 
-#: route_ui.cc:874
+#: route_ui.cc:879
 msgid "Assign selected tracks and buses (prefader)"
 msgstr "Ausgewählte Audiospuren und Busse zuweisen (Pre-Fader)"
 
-#: route_ui.cc:877
+#: route_ui.cc:882
 msgid "Assign selected tracks (postfader)"
 msgstr "Ausgewählte Audiospuren zuweisen (Post-Fader)"
 
-#: route_ui.cc:881
+#: route_ui.cc:886
 msgid "Assign selected tracks and buses (postfader)"
 msgstr "Ausgewählte Audiospuren und Busse zuweisen (Post-Fader)"
 
-#: route_ui.cc:884
+#: route_ui.cc:889
 msgid "Copy track/bus gains to sends"
 msgstr "Lautstärken der Spuren/Busse auf ihre Sends kopieren"
 
-#: route_ui.cc:885
+#: route_ui.cc:890
 msgid "Set sends gain to -inf"
 msgstr "Setze Sends-Lautstärken to -inf"
 
-#: route_ui.cc:886
+#: route_ui.cc:891
 msgid "Set sends gain to 0dB"
 msgstr "Setze Sends-Lautstärken to 0dB"
 
-#: route_ui.cc:1206
+#: route_ui.cc:1211
 msgid "Solo Isolate"
 msgstr "Isoliertes Solo"
 
-#: route_ui.cc:1235
+#: route_ui.cc:1240
 msgid "Pre Fader"
 msgstr "Pre Fader"
 
-#: route_ui.cc:1241
+#: route_ui.cc:1246
 msgid "Post Fader"
 msgstr "Post Fader"
 
-#: route_ui.cc:1247
+#: route_ui.cc:1252
 msgid "Control Outs"
 msgstr "Vorhörausgang"
 
-#: route_ui.cc:1253
+#: route_ui.cc:1258
 msgid "Main Outs"
 msgstr "Hauptausgänge"
 
-#: route_ui.cc:1385
+#: route_ui.cc:1390
 msgid "Color Selection"
 msgstr "Farbauswahl"
 
-#: route_ui.cc:1472
+#: route_ui.cc:1477
 msgid ""
 "Do you really want to remove track \"%1\" ?\n"
 "\n"
@@ -10148,7 +10303,7 @@ msgstr ""
 "\n"
 "(Dies kann nicht rückgängig gemacht werden!)"
 
-#: route_ui.cc:1474
+#: route_ui.cc:1479
 msgid ""
 "Do you really want to remove bus \"%1\" ?\n"
 "\n"
@@ -10157,15 +10312,15 @@ msgstr ""
 "Wollen Sie den Bus \"%1\" wirklich löschen?\n"
 "(Dies kann nicht rückgängig gemacht werden!)"
 
-#: route_ui.cc:1482
+#: route_ui.cc:1487
 msgid "Remove track"
 msgstr "Spur löschen"
 
-#: route_ui.cc:1484
+#: route_ui.cc:1489
 msgid "Remove bus"
 msgstr "Bus löschen"
 
-#: route_ui.cc:1511
+#: route_ui.cc:1516
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
@@ -10174,47 +10329,47 @@ msgstr ""
 "wird nicht empfohlen.\n"
 "Wollen Sie diesen neuen Namen verwenden?"
 
-#: route_ui.cc:1515
+#: route_ui.cc:1520
 msgid "Use the new name"
 msgstr "Neuen Namen verwenden"
 
-#: route_ui.cc:1516
+#: route_ui.cc:1521
 msgid "Re-edit the name"
 msgstr "Namen bearbeiten"
 
-#: route_ui.cc:1529
+#: route_ui.cc:1534
 msgid "Rename Track"
 msgstr "Spur umbenennen"
 
-#: route_ui.cc:1531
+#: route_ui.cc:1536
 msgid "Rename Bus"
 msgstr "Bus umbenennen"
 
-#: route_ui.cc:1690
+#: route_ui.cc:1695
 msgid " latency"
 msgstr " Latenz"
 
-#: route_ui.cc:1703
+#: route_ui.cc:1708
 msgid "Cannot create route template directory %1"
 msgstr "Kann das Vorlagenverzeichnis für Spuren/Busse %1 nicht erzeugen"
 
-#: route_ui.cc:1709
+#: route_ui.cc:1714
 msgid "Save As Template"
 msgstr "Als Vorlage speichern"
 
-#: route_ui.cc:1710
+#: route_ui.cc:1715
 msgid "Template name:"
 msgstr "Name der Vorlage:"
 
-#: route_ui.cc:1783
+#: route_ui.cc:1788
 msgid "Remote Control ID"
 msgstr "ID für Fernsteuerung"
 
-#: route_ui.cc:1793
+#: route_ui.cc:1798
 msgid "Remote control ID:"
 msgstr "ID für Fernsteuerung:"
 
-#: route_ui.cc:1807
+#: route_ui.cc:1812
 msgid ""
 "The remote control ID of %1 is: %2\n"
 "\n"
@@ -10226,15 +10381,15 @@ msgstr ""
 "\n"
 "Die Fernbedienungs-ID von %3 kann nicht geändert werden."
 
-#: route_ui.cc:1811
+#: route_ui.cc:1816
 msgid "the master bus"
 msgstr "der Master-Bus"
 
-#: route_ui.cc:1811
+#: route_ui.cc:1816
 msgid "the monitor bus"
 msgstr "der Monitor-Bus"
 
-#: route_ui.cc:1813
+#: route_ui.cc:1818
 msgid ""
 "The remote control ID of %6 is: %3\n"
 "\n"
@@ -10253,15 +10408,15 @@ msgstr ""
 "%4Sie können dies im Tab \"Benutzerinteraktion\" im Fenster Einstellungen "
 "ändern%5"
 
-#: route_ui.cc:1816
+#: route_ui.cc:1821
 msgid "the mixer"
 msgstr "der Mixer"
 
-#: route_ui.cc:1816
+#: route_ui.cc:1821
 msgid "the editor"
 msgstr "der Editor"
 
-#: route_ui.cc:1871
+#: route_ui.cc:1876
 msgid ""
 "Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
 "to show menu."
@@ -10269,7 +10424,7 @@ msgstr ""
 "Linksklick, um die Phase von Kanal %1 zu invertieren. Rechtsklick zeigt das "
 "Menü."
 
-#: route_ui.cc:1873
+#: route_ui.cc:1878
 msgid "Click to show a menu of channels for inversion (phase reverse)"
 msgstr ""
 "Klicken, um ein Menü zum Invertieren der Kanäle (Phasendrehung) anzuzeigen"
@@ -10588,11 +10743,15 @@ msgid ""
 "Use Video File's FPS Instead of Timecode Value for Timeline and Video "
 "Monitor."
 msgstr ""
+"Benutze FPS aus Videodatei statt des Timecode-Wertes für Zeitleiste und "
+"Videomonitor."
 
 #: session_option_editor.cc:91
 msgid ""
 "Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless in JACK-sync)."
 msgstr ""
+"Wende Pull-Up/Down auf Videozeitleiste und Videomonitor an (ausser bei JACK-"
+"sync)."
 
 #: session_option_editor.cc:96
 msgid "Ext Timecode Offsets"
@@ -10771,87 +10930,135 @@ msgstr "Neue Marker an Takte und Schläge binden"
 msgid "Glue new regions to bars and beats"
 msgstr "Neue Regionen an Takte und Schläge binden"
 
-#: sfdb_ui.cc:87 sfdb_ui.cc:107 sfdb_ui.cc:116
+#: session_option_editor.cc:275 session_option_editor.cc:277
+#: session_option_editor.cc:284 session_option_editor.cc:291
+#: session_option_editor.cc:298 session_option_editor.cc:300
+#: session_option_editor.cc:307 session_option_editor.cc:314
+#: session_option_editor.cc:321 session_option_editor.cc:323
+msgid "Meterbridge"
+msgstr "Meterbridge"
+
+#: session_option_editor.cc:275
+msgid "Route Display"
+msgstr "Routenanzeige"
+
+#: session_option_editor.cc:279
+msgid "Show Midi Tracks"
+msgstr "Zeige MIDI-Spuren"
+
+#: session_option_editor.cc:286
+msgid "Show Busses"
+msgstr "Zeige Busse"
+
+#: session_option_editor.cc:293
+msgid "Include Master Bus"
+msgstr "Zeige Master-Bus"
+
+#: session_option_editor.cc:298
+msgid "Button Area"
+msgstr "Schaltflächenbereich"
+
+#: session_option_editor.cc:302
+msgid "Rec-enable Button"
+msgstr "Schaltfläche für Aufnahmebereitschaft"
+
+#: session_option_editor.cc:309
+msgid "Mute Button"
+msgstr "Schaltfläche für Stummschaltung"
+
+#: session_option_editor.cc:316
+msgid "Solo Button"
+msgstr "Schaltfläche für Solostatus"
+
+#: session_option_editor.cc:321
+msgid "Name Labels"
+msgstr "Namensfelder"
+
+#: session_option_editor.cc:325
+msgid "Track Name"
+msgstr "Spurname"
+
+#: sfdb_ui.cc:88 sfdb_ui.cc:108 sfdb_ui.cc:117
 msgid "as new tracks"
 msgstr "als neue Spuren"
 
-#: sfdb_ui.cc:89 sfdb_ui.cc:109
+#: sfdb_ui.cc:90 sfdb_ui.cc:110
 msgid "to selected tracks"
 msgstr "zu ausgewählten Spuren"
 
-#: sfdb_ui.cc:91 sfdb_ui.cc:111
+#: sfdb_ui.cc:92 sfdb_ui.cc:112
 msgid "to region list"
 msgstr "zur Liste der Regionen"
 
-#: sfdb_ui.cc:93 sfdb_ui.cc:113
+#: sfdb_ui.cc:94 sfdb_ui.cc:114
 msgid "as new tape tracks"
 msgstr "als neue Band-Spuren"
 
-#: sfdb_ui.cc:97
+#: sfdb_ui.cc:98
 msgid "programming error: unknown import mode string %1"
 msgstr "Programmierfehler: unbekannter Importmodus %1"
 
-#: sfdb_ui.cc:124
+#: sfdb_ui.cc:125
 msgid "Auto-play"
 msgstr "Auto-Play"
 
-#: sfdb_ui.cc:130 sfdb_ui.cc:237
+#: sfdb_ui.cc:131 sfdb_ui.cc:238
 msgid "<b>Sound File Information</b>"
 msgstr "<b>Eigenschaften der Audiodatei</b>"
 
-#: sfdb_ui.cc:142
+#: sfdb_ui.cc:143
 msgid "Timestamp:"
 msgstr "Zeitstempel:"
 
-#: sfdb_ui.cc:144
+#: sfdb_ui.cc:145
 msgid "Format:"
 msgstr "Format:"
 
-#: sfdb_ui.cc:183 sfdb_ui.cc:530
+#: sfdb_ui.cc:184 sfdb_ui.cc:530
 msgid "Tags:"
 msgstr "Stichworte:"
 
-#: sfdb_ui.cc:320
+#: sfdb_ui.cc:321
 msgid "Auditioning of MIDI files is not yet supported"
 msgstr "Vorhören von MIDI-Dateien wird noch nicht unterstützt"
 
-#: sfdb_ui.cc:327
+#: sfdb_ui.cc:328
 msgid "Could not read file: %1 (%2)."
 msgstr "Konnte Datei nicht lesen: %1 (%2)."
 
-#: sfdb_ui.cc:349
+#: sfdb_ui.cc:351
 msgid "Could not access soundfile: "
 msgstr "Konnte auf Audiodatei nicht zugreifen: "
 
-#: sfdb_ui.cc:403
+#: sfdb_ui.cc:405
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr "SoundFileBox: Konnte Zeichenkette nicht zerlegen: "
 
-#: sfdb_ui.cc:423 sfdb_ui.cc:425
+#: sfdb_ui.cc:425 sfdb_ui.cc:427
 msgid "Search"
 msgstr "Suchen"
 
-#: sfdb_ui.cc:449
+#: sfdb_ui.cc:451
 msgid "Audio and MIDI files"
 msgstr "Audio- und MIDIdateien"
 
-#: sfdb_ui.cc:452
+#: sfdb_ui.cc:454
 msgid "Audio files"
 msgstr "Audiodateien"
 
-#: sfdb_ui.cc:455
+#: sfdb_ui.cc:457
 msgid "MIDI files"
 msgstr "MIDI-Dateien"
 
-#: sfdb_ui.cc:458 add_video_dialog.cc:131
+#: sfdb_ui.cc:460 add_video_dialog.cc:131
 msgid "All files"
 msgstr "Alle Dateien"
 
-#: sfdb_ui.cc:477 add_video_dialog.cc:142
+#: sfdb_ui.cc:479 add_video_dialog.cc:142
 msgid "Browse Files"
 msgstr "Durchsuchen"
 
-#: sfdb_ui.cc:506
+#: sfdb_ui.cc:508
 msgid "Paths"
 msgstr "Pfade"
 
@@ -10897,132 +11104,120 @@ msgstr "Am schlechtesten bewertetes"
 
 #: sfdb_ui.cc:555
 msgid "More"
-msgstr ""
+msgstr "Mehr"
+
+#: sfdb_ui.cc:559
+msgid "Similar"
+msgstr "Ähnlich"
 
-#: sfdb_ui.cc:572
+#: sfdb_ui.cc:571
 msgid "ID"
 msgstr "ID"
 
-#: sfdb_ui.cc:573 add_video_dialog.cc:83
+#: sfdb_ui.cc:572 add_video_dialog.cc:83
 msgid "Filename"
 msgstr "Dateiname"
 
-#: sfdb_ui.cc:575
+#: sfdb_ui.cc:574
 msgid "Duration"
 msgstr "Dauer"
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:575
 msgid "Size"
 msgstr "Größe"
 
-#: sfdb_ui.cc:577
+#: sfdb_ui.cc:576
 msgid "Samplerate"
 msgstr "Samplerate"
 
-#: sfdb_ui.cc:578
+#: sfdb_ui.cc:577
 msgid "License"
 msgstr "Lizenz"
 
-#: sfdb_ui.cc:594
+#: sfdb_ui.cc:595
 msgid "Search Freesound"
 msgstr "Freesound durchsuchen"
 
-#: sfdb_ui.cc:615
+#: sfdb_ui.cc:616
 msgid "Press to import selected files and close this window"
 msgstr ""
 "Drücken Sie hier, um die angewählten Dateien zu importieren und dieses "
 "Fenster zu schließen"
 
-#: sfdb_ui.cc:616
+#: sfdb_ui.cc:617
 msgid "Press to import selected files and leave this window open"
 msgstr ""
 "Drücken Sie hier, um die angewählten Dateien zu importieren und dieses "
 "Fenster offen zu lassen"
 
-#: sfdb_ui.cc:617
+#: sfdb_ui.cc:618
 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:846
-msgid "found %1 match"
-msgid_plural "found %1 matches"
-msgstr[0] "%1 Treffer gefunden"
-msgstr[1] "%1 Treffer gefunden"
-
-#: sfdb_ui.cc:862
+#: sfdb_ui.cc:814
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr "SoundFileBrowser: Konnte Zeichenkete nicht zerlegen:"
 
-#: sfdb_ui.cc:960
+#: sfdb_ui.cc:1014
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 weitere Seite von 100 Ergebnissen verfügbar"
+msgstr[1] "%1 weitere Seiten von 100 Ergebnissen verfügbar"
 
-#: sfdb_ui.cc:965
+#: sfdb_ui.cc:1019
 msgid "No more results available"
-msgstr ""
+msgstr "Keine weiteren Ergebnisse verfügbar"
 
-#: sfdb_ui.cc:1029
+#: sfdb_ui.cc:1083
 msgid "B"
 msgstr "B"
 
-#: sfdb_ui.cc:1031
+#: sfdb_ui.cc:1085
 msgid "kB"
 msgstr "kB"
 
-#: sfdb_ui.cc:1033 sfdb_ui.cc:1035
+#: sfdb_ui.cc:1087 sfdb_ui.cc:1089
 msgid "MB"
 msgstr "MB"
 
-#: sfdb_ui.cc:1037
+#: sfdb_ui.cc:1091
 msgid "GB"
 msgstr "GB"
 
-#: sfdb_ui.cc:1070
-msgid "Search returned no results."
-msgstr "Die Suche erbrachte keine Ergebnisse"
-
-#: sfdb_ui.cc:1072
-msgid "Found %1 match"
-msgid_plural "Found %1 matches"
-msgstr[0] "%1 Treffer gefunden"
-msgstr[1] "%1 Treffer gefunden"
-
-#: sfdb_ui.cc:1277 sfdb_ui.cc:1585 sfdb_ui.cc:1635 sfdb_ui.cc:1653
+#: sfdb_ui.cc:1305 sfdb_ui.cc:1613 sfdb_ui.cc:1663 sfdb_ui.cc:1681
 msgid "one track per file"
 msgstr "eine Spur pro Datei"
 
-#: sfdb_ui.cc:1280 sfdb_ui.cc:1636 sfdb_ui.cc:1654
+#: sfdb_ui.cc:1308 sfdb_ui.cc:1664 sfdb_ui.cc:1682
 msgid "one track per channel"
 msgstr "eine Spur pro Kanal"
 
-#: sfdb_ui.cc:1288 sfdb_ui.cc:1638 sfdb_ui.cc:1655
+#: sfdb_ui.cc:1316 sfdb_ui.cc:1666 sfdb_ui.cc:1683
 msgid "sequence files"
 msgstr "Dateien aneinanderreihen"
 
-#: sfdb_ui.cc:1291 sfdb_ui.cc:1643
+#: sfdb_ui.cc:1319 sfdb_ui.cc:1671
 msgid "all files in one track"
 msgstr "Alle Dateien in eine Spur"
 
-#: sfdb_ui.cc:1292 sfdb_ui.cc:1637
+#: sfdb_ui.cc:1320 sfdb_ui.cc:1665
 msgid "merge files"
 msgstr "Dateien zusammenfügen"
 
-#: sfdb_ui.cc:1298 sfdb_ui.cc:1640
+#: sfdb_ui.cc:1326 sfdb_ui.cc:1668
 msgid "one region per file"
 msgstr "eine Region pro Datei"
 
-#: sfdb_ui.cc:1301 sfdb_ui.cc:1641
+#: sfdb_ui.cc:1329 sfdb_ui.cc:1669
 msgid "one region per channel"
 msgstr "eine Region pro Kanal"
 
-#: sfdb_ui.cc:1306 sfdb_ui.cc:1642 sfdb_ui.cc:1656
+#: sfdb_ui.cc:1334 sfdb_ui.cc:1670 sfdb_ui.cc:1684
 msgid "all files in one region"
 msgstr "alle Dateien in einer Region"
 
-#: sfdb_ui.cc:1373
+#: sfdb_ui.cc:1401
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
@@ -11030,55 +11225,55 @@ msgstr ""
 "Eine oder mehrere der ausgewählten Dateien\n"
 "können von %1 nicht verwendet werden"
 
-#: sfdb_ui.cc:1513
+#: sfdb_ui.cc:1541
 msgid "Copy files to session"
 msgstr "Kopiere Dateien in Projekt"
 
-#: sfdb_ui.cc:1530 sfdb_ui.cc:1693
+#: sfdb_ui.cc:1558 sfdb_ui.cc:1721
 msgid "file timestamp"
 msgstr "Zeitstempel"
 
-#: sfdb_ui.cc:1531 sfdb_ui.cc:1695
+#: sfdb_ui.cc:1559 sfdb_ui.cc:1723
 msgid "edit point"
 msgstr "Arbeitspunkt"
 
-#: sfdb_ui.cc:1532 sfdb_ui.cc:1697
+#: sfdb_ui.cc:1560 sfdb_ui.cc:1725
 msgid "playhead"
 msgstr "Positionszeiger"
 
-#: sfdb_ui.cc:1533
+#: sfdb_ui.cc:1561
 msgid "session start"
 msgstr "Projektanfang"
 
-#: sfdb_ui.cc:1538
+#: sfdb_ui.cc:1566
 msgid "<b>Add files as ...</b>"
 msgstr "<b>Füge Dateien hinzu als...</b>"
 
-#: sfdb_ui.cc:1560
+#: sfdb_ui.cc:1588
 msgid "<b>Insert at</b>"
 msgstr "<b>Einfügen bei</b>"
 
-#: sfdb_ui.cc:1573
+#: sfdb_ui.cc:1601
 msgid "<b>Mapping</b>"
 msgstr "<b>Zuordnung</b>"
 
-#: sfdb_ui.cc:1591
+#: sfdb_ui.cc:1619
 msgid "<b>Conversion quality</b>"
 msgstr "<b>Konvertierungsqualität:</b>"
 
-#: sfdb_ui.cc:1603 sfdb_ui.cc:1709
+#: sfdb_ui.cc:1631 sfdb_ui.cc:1737
 msgid "Best"
 msgstr "bestmöglich"
 
-#: sfdb_ui.cc:1604 sfdb_ui.cc:1711
+#: sfdb_ui.cc:1632 sfdb_ui.cc:1739
 msgid "Good"
 msgstr "gut"
 
-#: sfdb_ui.cc:1605 sfdb_ui.cc:1713
+#: sfdb_ui.cc:1633 sfdb_ui.cc:1741
 msgid "Quick"
 msgstr "schnell"
 
-#: sfdb_ui.cc:1607
+#: sfdb_ui.cc:1635
 msgid "Fastest"
 msgstr "Schnellstmöglich"
 
@@ -11166,21 +11361,21 @@ msgstr "Erweiterte Optionen für dieses Projekt"
 
 #: startup.cc:194
 msgid ""
-"<b>Welcome to this BETA release of Ardour 3.0</b>\n"
+"<b>Welcome to this BETA release of Ardour %1</b>\n"
 "\n"
-"Ardour 3.0 has been released for Linux but because of the lack of testers,\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"
-"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 "
+"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 3.0-beta.\n"
-"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"   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"
-"6) Please <b>DO</b> join us on IRC for real time discussions about ardour3. "
+"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"
@@ -11188,27 +11383,25 @@ msgid ""
 "\n"
 "                http://ardour.org/support\n"
 msgstr ""
-"<b>Willkommen zu diesem BETA-Release von Ardour 3.0</b>\n"
+"<b>Willkommen zu diesem BETA-Release von Ardour %1</b>\n"
 "\n"
-"Ardour 3.0 für Linux ist veröffentlicht worden, aufgrund des Mangels an "
+"Ardour %1 für Linux ist veröffentlicht worden, aufgrund des Mangels an "
 "Testern \n"
 "ist es für OS X jedoch immer noch im Beta-Stadium. Daher ein paar "
 "Richtlinien:\n"
 "\n"
 "1) Bitte verwenden Sie diese Software <b>NICHT</b> mit der Erwartung, sie "
 "wäre stabil\n"
-"    oder Zuverlässig, auch wenn sie das je nach Ihrem Workflow sein mag.\n"
-"2) Bitte besuchen Sie http://ardour.org/a3_features für eine Einführung in "
-"die neuen Features.\n"
-"3) <b>Bitte verwenden Sie NICHT die Foren von ardour.org, um Probleme zu "
+"    oder zuverlässig, auch wenn sie das je nach Ihrem Workflow sein mag.\n"
+"2) <b>Bitte verwenden Sie NICHT die Foren von ardour.org, um Probleme zu "
 "melden</b>.\n"
-"4) Bitte <b>VERWENDEN</b> Sie den Bugtracker http://tracker.ardour.org/ um "
+"3) Bitte <b>VERWENDEN</b> Sie den Bugtracker http://tracker.ardour.org/ um "
 "Probleme\n"
 "    zu melden. Geben Sie dabei Die Versionsnummer 3.0-beta an.\n"
-"5) Bitte <b>VERWENDEN</b> Sie die ardour-users Mailingliste (auf Englisch), "
+"4) Bitte <b>VERWENDEN</b> Sie die ardour-users Mailingliste (auf Englisch), "
 "um Ideen\n"
 "    zu diskutieren und Kommentare zur Software abzugeben.\n"
-"6) Bitte <b>BESUCHEN</b> Sie uns in unserem IRC Channel, um in Echtzeit über "
+"5) Bitte <b>BESUCHEN</b> Sie uns in unserem IRC-Kanal, um in Echtzeit über "
 "Ardour3\n"
 "    zu diskutieren (auch auf Englisch). Sie können direkt aus Ardour über "
 "Hilfe -> Chat\n"
@@ -11351,10 +11544,6 @@ msgstr "Informieren Sie sich auf der Webseite weiter..."
 msgid "Click to open the program website in your web browser"
 msgstr "Klicken Sie, um die Webseite in Ihrem Web-Browse zu öffnen"
 
-#: startup.cc:594
-msgid "What would you like to do ?"
-msgstr "Was möchten Sie tun?"
-
 #: startup.cc:729
 msgid "Open"
 msgstr "Öffnen"
@@ -11367,83 +11556,83 @@ msgstr "Projektname:"
 msgid "Create session folder in:"
 msgstr "Ort des Projektverzeichnisses:"
 
-#: startup.cc:813
+#: startup.cc:821
 msgid "Select folder for session"
 msgstr "Ordner für Projekt wählen"
 
-#: startup.cc:845
+#: startup.cc:853
 msgid "Use this template"
 msgstr "Diese Vorlage verwenden"
 
-#: startup.cc:848
+#: startup.cc:856
 msgid "no template"
 msgstr "keine Vorlage"
 
-#: startup.cc:876
+#: startup.cc:884
 msgid "Use an existing session as a template:"
 msgstr "Ein vorhandenes Projekt als Vorlage verwenden:"
 
-#: startup.cc:888
+#: startup.cc:896
 msgid "Select template"
 msgstr "Vorlage auswählen"
 
-#: startup.cc:914
+#: startup.cc:922
 msgid "New Session"
 msgstr "Neues Projekt"
 
-#: startup.cc:1068
+#: startup.cc:1077
 msgid "Select session file"
 msgstr "Projektdatei auswählen"
 
-#: startup.cc:1084
+#: startup.cc:1093
 msgid "Browse:"
 msgstr "Durchsuchen:"
 
-#: startup.cc:1093
+#: startup.cc:1102
 msgid "Select a session"
 msgstr "Projekt auswählen"
 
-#: startup.cc:1119 startup.cc:1120 startup.cc:1121
+#: startup.cc:1129 startup.cc:1130 startup.cc:1131
 msgid "channels"
 msgstr "Kanäle"
 
-#: startup.cc:1135
+#: startup.cc:1145
 msgid "<b>Busses</b>"
 msgstr "<b>Busse</b>"
 
-#: startup.cc:1136
+#: startup.cc:1146
 msgid "<b>Inputs</b>"
 msgstr "<b>Eingänge</b>"
 
-#: startup.cc:1137
+#: startup.cc:1147
 msgid "<b>Outputs</b>"
 msgstr "<b>Ausgänge</b>"
 
-#: startup.cc:1145
+#: startup.cc:1155
 msgid "Create master bus"
 msgstr "Master-Bus erstellen"
 
-#: startup.cc:1155
+#: startup.cc:1165
 msgid "Automatically connect to physical inputs"
 msgstr "Automatisch mit Audioeingängen verbinden"
 
-#: startup.cc:1162 startup.cc:1221
+#: startup.cc:1172 startup.cc:1231
 msgid "Use only"
 msgstr "Benutze nur"
 
-#: startup.cc:1215
+#: startup.cc:1225
 msgid "Automatically connect outputs"
 msgstr "Ausgänge automatisch verbinden"
 
-#: startup.cc:1237
+#: startup.cc:1247
 msgid "... to master bus"
 msgstr "... mit dem Master-Bus"
 
-#: startup.cc:1247
+#: startup.cc:1257
 msgid "... to physical outputs"
 msgstr "... mit den Audioausgängen"
 
-#: startup.cc:1297
+#: startup.cc:1307
 msgid "Advanced Session Options"
 msgstr "Erweiterte Einstellungen"
 
@@ -11967,7 +12156,7 @@ msgstr "Zeichne \"flache\" Schaltflächen"
 
 #: theme_manager.cc:61
 msgid "All floating windows are dialogs"
-msgstr ""
+msgstr "Alle schwebenden Fenster sind Dialoge"
 
 #: theme_manager.cc:62
 msgid "Draw waveforms with color gradient"
@@ -11984,6 +12173,10 @@ msgid ""
 "This may help with some window managers. This requires a restart of %1 to "
 "take effect"
 msgstr ""
+"Markiere alle schwebenden Fenster als Typ \"Dialog\", statt für einige "
+"\"Utility\"  zu verwenden.\n"
+"Dies kann bei einigen Fenstermanagern helfen. Sie müssen %1 starten, um "
+"diese Option zu aktivieren"
 
 #: theme_manager.cc:229
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
@@ -12124,19 +12317,19 @@ msgstr "Konfigurationsdatei %1 nicht gespeichert"
 msgid "bad XPM header %1"
 msgstr "Fehlerhafter XPM Header %1"
 
-#: utils.cc:292
+#: utils.cc:292 utils.cc:324
 msgid "missing RGBA style for \"%1\""
 msgstr "Fehlender RGBA Style für \"%1\""
 
-#: utils.cc:544
+#: utils.cc:591
 msgid "cannot find XPM file for %1"
 msgstr "Konnte XPM-Datei für %1 nicht finden"
 
-#: utils.cc:570
+#: utils.cc:617
 msgid "cannot find icon image for %1 using %2"
 msgstr "Konnte Icon-Bild für %1 unter %2 nicht finden"
 
-#: utils.cc:585
+#: utils.cc:632
 msgid "Caught exception while loading icon named %1"
 msgstr ""
 "Während des Ladens des Icons mit dem Namen %1 trat ein Ausnahmefehler auf"
@@ -12146,104 +12339,112 @@ msgid "VerboseCanvasCursor"
 msgstr "Ausführlicher Canvas-Cursor"
 
 #: add_video_dialog.cc:54
-#, fuzzy
 msgid "Set Video Track"
-msgstr "Audiospur hinzufügen"
+msgstr "Videospur-Einstellungen"
 
 #: add_video_dialog.cc:62
-#, fuzzy
 msgid "Launch External Video Monitor"
-msgstr "Monitor"
+msgstr "Externen Videomonitor starten"
 
 #: add_video_dialog.cc:63
 msgid "Adjust Session Framerate to Match Video Framerate"
-msgstr ""
+msgstr "Projekt-Framerate an Video-Framerate anpassen"
 
 #: add_video_dialog.cc:65
 msgid "Reload docroot"
-msgstr ""
+msgstr "docroot neu laden"
 
 #: add_video_dialog.cc:110 add_video_dialog.cc:114
-#, fuzzy
 msgid "VideoServerIndex"
-msgstr "Video-Server anhalten"
+msgstr "VideoServerIndex"
 
 #: add_video_dialog.cc:128
-#, fuzzy
 msgid "Video files"
-msgstr "Audiodateien"
+msgstr "Videodateien"
 
 #: add_video_dialog.cc:163
-#, fuzzy
 msgid "<b>Video Information</b>"
-msgstr "<b>Eigenschaften der Audiodatei</b>"
+msgstr "<b>Videoinformationen</b>"
 
 #: add_video_dialog.cc:166
-#, fuzzy
 msgid "Start:"
-msgstr "Start"
+msgstr "Start:"
 
 #: add_video_dialog.cc:172
-#, fuzzy
 msgid "Frame rate:"
-msgstr "Samplerate:"
+msgstr "Framerate:"
 
 #: add_video_dialog.cc:175
 msgid "Aspect Ratio:"
-msgstr ""
+msgstr "Seitenverhältnis:"
 
 #: add_video_dialog.cc:653
 msgid " %1 fps"
-msgstr ""
+msgstr " %1 fps"
 
-#: editor_videotimeline.cc:138
-#, fuzzy
+#: editor_videotimeline.cc:146
 msgid "Export Successful: %1"
-msgstr "Exportiere MIDI: %1"
+msgstr "Export erfolgreich: %1"
 
-#: video_timeline.cc:467
+#: 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 ""
+"Fehler beim Parsen der Videodatei. Läuft der Videoserver? Ist die Datei für "
+"den Videoserver lesbar? Ist die docroot passend eingestellt? Ist die Datei "
+"tatsächlich eine Videodatei?"
 
-#: video_timeline.cc:501
-msgid "Failed to set session-framerate: "
-msgstr ""
-
-#: video_timeline.cc:501
-msgid " does not have a corresponding option setting in Ardour."
+#: video_timeline.cc:506
+msgid ""
+"Failed to set session-framerate: '%1' does not have a corresponding option "
+"setting in %2."
 msgstr ""
+"Setzen der Projektframerate fehlgeschlagen: '%1' hat keine entsprechende "
+"Einstellungsoption in %2."
 
-#: video_timeline.cc:507
+#: video_timeline.cc:514
 msgid ""
-"Video file's framerate is not equal to Ardour session timecode's framerate: "
+"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
+"vs '%3'"
 msgstr ""
+"Framerate der Videodatei entspricht nicht der Framerate des Timecodes im %1-"
+"Projekt: '%2' vs. '%3'"
 
-#: video_timeline.cc:508
-msgid " vs "
+#: video_timeline.cc:587
+msgid ""
+"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
+"means that the video server was not started by ardour and uses a different "
+"document-root."
 msgstr ""
+"MDocroot des Videoserver stimmt nicht überein. %1: '%2', Videoserver: '%3'. "
+"Das bedeutet üblicherweise, dass der Videoserver nicht von Ardour gestartet "
+"wurde und einen anderen Dokumenten-Wurzelpfad verwendet."
 
-#: video_timeline.cc:690
+#: video_timeline.cc:736
 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')."
 msgstr ""
+"Der Videomonitor 'xjadeo' wurde nicht gefunden. Bitte installieren Sie "
+"http://xjadeo.sf.net/ (ein benutzerspezifischer Pfad für xjadeo kann durch "
+"Setzen der Umgebungsvariablen XJREMOTE angegeben werden. Er sollte auf ein "
+"Programm zeigen, das zu dem Fernsteuerungsprotokoll 'xjremote' von xjadeo "
+"kompatibel ist)."
 
-#: video_monitor.cc:282
-#, fuzzy
+#: video_monitor.cc:281
 msgid "Video Monitor: File Not Found."
-msgstr "Monitor"
+msgstr "Videomonitor: Datei nicht gefunden."
 
-#: transcode_ffmpeg.cc:71
+#: transcode_ffmpeg.cc:72
 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"
-"Ardour requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
 "\n"
-"The tools are included with the Ardour releases from ardour.org and also "
+"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 "
@@ -12252,38 +12453,48 @@ msgid ""
 "recommend creating symbolic links from ffmpeg to ffmpeg_harvid and from "
 "ffprobe to ffprobe_harvid.\n"
 msgstr ""
+"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden "
+"werden.\n"
+"Bis diese Werkzeuge installiert sind, ist Videoexport nicht möglich.\n"
+"%1 benötigt ffmpeg und ffprobe von ffmpeg.org in der Version 1.1 oder "
+"neuer.\n"
+"\n"
+"Diese Werkzeuge sind in den %1-Paketen von ardour.org inkludiert und auch "
+"mit dem Videoserver auf http://x42.github.com/harvid/ erhältlich.\n"
+"\n"
+"Wichtig:  die Dateien müssen in $PATH installiert sein und die Namen "
+"ffmpeg_harvid und ffprobe_harvid.\n"
+"Falls Sie bereits eine ffmpeg Installation auf Ihrem System haben, empfehlen "
+"wir, symbolische Links von ffmpeg zu ffmpeg_harvid und von ffprobe zu "
+"ffprobe_harvid anzulegen.\n"
 
 #: transcode_video_dialog.cc:55
-#, fuzzy
 msgid "Transcode/Import Video File "
-msgstr "Exportiere Audio-Datei(en)..."
+msgstr "Videodatei transkodieren/importieren"
 
 #: transcode_video_dialog.cc:57
-#, fuzzy
 msgid "Output File:"
-msgstr "Ausgabegerät:"
+msgstr "Ausgabedatei:"
 
 #: transcode_video_dialog.cc:60 export_video_dialog.cc:72
 msgid "Abort"
-msgstr ""
+msgstr "Abbruch"
 
 #: transcode_video_dialog.cc:62
-#, fuzzy
 msgid "Height = "
-msgstr "Höhe"
+msgstr "Höhe ="
 
 #: transcode_video_dialog.cc:65
 msgid "Manual Override"
-msgstr ""
+msgstr "Manuelle Eingabe"
 
-#: transcode_video_dialog.cc:69
-msgid "Debug Mode: Print ffmpeg Command and Output to stdout."
-msgstr ""
+#: transcode_video_dialog.cc:69 export_video_dialog.cc:88
+msgid "Debug Mode: Print ffmpeg command and output to stdout."
+msgstr "Debug-Modus: gibt die ffmpeg-Befehlszeile und -Ausgabe an stdout aus."
 
 #: transcode_video_dialog.cc:106
-#, fuzzy
 msgid "<b>File Information</b>"
-msgstr "<b>Eigenschaften der Audiodatei</b>"
+msgstr "<b>Dateiinformationen</b>"
 
 #: transcode_video_dialog.cc:112
 msgid ""
@@ -12291,230 +12502,223 @@ msgid ""
 "is not possible until you install those tools. See the Log widow for more "
 "information."
 msgstr ""
+"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden "
+"werden. Bis diese Werkzeuge installiert sind, ist Videoimport nicht möglich. "
+"Sehen Sie im Log-Fenster nach weiteren Informationen."
 
 #: transcode_video_dialog.cc:119
 msgid ""
 "File-info can not be read. Most likely '%1' is not a valid video-file or an "
 "unsupported video codec or format."
 msgstr ""
+"Dateiinformationen können nicht gelesen werden. Vermutlich ist '%1' keine "
+"gültige Videodatei, oder enthält einen nicht unterstützten Videocodec bzw. "
+"ein nicht unterstütztes Videoformat."
 
 #: transcode_video_dialog.cc:133
 msgid "FPS:"
-msgstr ""
+msgstr "FPS:"
 
 #: transcode_video_dialog.cc:135
-#, fuzzy
 msgid "Duration:"
-msgstr "Dauer"
+msgstr "Dauer:"
 
 #: transcode_video_dialog.cc:137
 msgid "Codec:"
-msgstr ""
+msgstr "Codec:"
 
 #: transcode_video_dialog.cc:139
 msgid "Geometry:"
-msgstr ""
+msgstr "Geometrie:"
 
 #: transcode_video_dialog.cc:154
-#, fuzzy
 msgid "??"
-msgstr "???"
+msgstr "??"
 
 #: transcode_video_dialog.cc:175
-#, fuzzy
 msgid "<b>Import Settings</b>"
-msgstr "<b>Optionen</b>"
+msgstr "<b>Importeinstellungen</b>"
 
 #: transcode_video_dialog.cc:180
 msgid "Do Not Import Video"
-msgstr ""
+msgstr "Video nicht importieren"
 
 #: transcode_video_dialog.cc:181
 msgid "Reference From Current Location"
-msgstr ""
+msgstr "Referenz von momentaner Position"
 
 #: transcode_video_dialog.cc:183
-#, fuzzy
 msgid "Import/Transcode Video to Session"
-msgstr "Aus Projekt importieren"
+msgstr "Video ins Projekt transkodieren/importieren"
 
 #: transcode_video_dialog.cc:197
 msgid "Scale Video: Width = "
-msgstr ""
+msgstr "Video skalieren: Breite = "
 
 #: transcode_video_dialog.cc:204
 msgid "Original Width"
-msgstr ""
+msgstr "Originalbreite"
 
 #: transcode_video_dialog.cc:219
 msgid "Bitrate (KBit/s):"
-msgstr ""
+msgstr "Bitrate (KBit/s):"
 
 #: transcode_video_dialog.cc:224
-#, fuzzy
 msgid "Extract Audio:"
-msgstr "Audio exportieren"
+msgstr "Audio extrahieren:"
 
 #: transcode_video_dialog.cc:344
-#, fuzzy
 msgid "Extracting Audio.."
-msgstr "Audio exportieren"
+msgstr "Extrahiere Audio..."
 
 #: transcode_video_dialog.cc:347
 msgid "Audio Extraction Failed."
-msgstr ""
+msgstr "Extrahieren des Audio gescheitert."
 
 #: transcode_video_dialog.cc:373
 msgid "Transcoding Video.."
-msgstr ""
+msgstr "Transkodiere Video.."
 
 #: transcode_video_dialog.cc:407
 msgid "Transcoding Failed."
-msgstr ""
+msgstr "Transkodieren gescheitert"
 
 #: transcode_video_dialog.cc:490
-#, fuzzy
 msgid "Save Transcoded Video File"
-msgstr "Exportiere Audio-Datei(en)..."
+msgstr "Sichere transkodierte Videodatei"
 
 #: video_server_dialog.cc:42
-#, fuzzy
 msgid "Launch Video Server"
-msgstr "Video-Server anhalten"
+msgstr "Video-Server starten"
 
 #: video_server_dialog.cc:43
 msgid "Server Executable:"
-msgstr ""
+msgstr "Server-Datei:"
 
 #: video_server_dialog.cc:45
-#, fuzzy
 msgid "Server Docroot:"
-msgstr "Server:"
+msgstr "Server Docroot:"
 
 #: video_server_dialog.cc:51
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr ""
+"Diesen Dialog nicht mehr anzeigen (kann in Einstellungen geändert werden)."
 
-#: video_server_dialog.cc:90
+#: video_server_dialog.cc:91
 msgid ""
 "The external video server 'harvid' can not be found. The tool is included "
-"with the Ardour releases from ardour.org, alternatively you can download it "
-"from http://x42.github.com/harvid/ or acquire it from your distribution."
+"with the %1 releases from ardour.org, alternatively you can download it from "
+"http://x42.github.com/harvid/ or acquire it from your distribution."
 msgstr ""
+"Der externe Videoserver \"harvid\" kann nicht gefunden werden. Das Werkzeug "
+"ist in den %1-Paketen von ardour.org inkludiert, aber Sie können es "
+"alternativ auch von http://x42.github.com/harvid/ herunterladen oder über "
+"das Paketmanagement Ihrer Distribution beziehen."
 
-#: video_server_dialog.cc:117
+#: video_server_dialog.cc:119
 msgid "Listen Address:"
-msgstr ""
+msgstr "Eingehende Adresse:"
 
-#: video_server_dialog.cc:122
-#, fuzzy
+#: video_server_dialog.cc:124
 msgid "Listen Port:"
-msgstr "Abhörpunkt"
+msgstr "Eingehender Port:"
 
-#: video_server_dialog.cc:127
-#, fuzzy
+#: video_server_dialog.cc:129
 msgid "Cache Size:"
-msgstr "Maximale Größe"
+msgstr "Cachegröße"
 
-#: video_server_dialog.cc:132
+#: video_server_dialog.cc:135
 msgid ""
-"Ardour relies on an external Video Server for the videotimeline.\n"
+"%1 relies on an external Video Server for the videotimeline.\n"
 "The server configured in Edit -> Prefereces -> Video is not reachable.\n"
 "Do you want ardour to launch 'harvid' on this machine?"
 msgstr ""
+"%1 benötigt einen externen Videoserver für die Video-Zeitleiste.\n"
+"Der in Bearbeiten -> Globale Einstellungen -> Video konfigurierte Server ist "
+"nicht erreichbar.\n"
+"Möchten Sie, daß Ardour \"harvid\" auf diesem Computer startet?"
 
-#: video_server_dialog.cc:171
-#, fuzzy
+#: video_server_dialog.cc:175
 msgid "Set Video Server Executable"
-msgstr "Der eingestellte Video-Server ist keine ausführbare Datei."
+msgstr "Setze Video-Serverpfad"
 
-#: video_server_dialog.cc:191
+#: video_server_dialog.cc:195
 msgid "Server docroot"
-msgstr ""
+msgstr "Server-docroot"
 
 #: utils_videotl.cc:52
 msgid "Destination is outside Video Server's docroot. "
-msgstr ""
+msgstr "Ziel ist ausserhalb der docroot des Videoservers."
 
 #: utils_videotl.cc:53
 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 ""
+"Der Dateipfad des Zieles befindet sich ausserhalb der docroot des "
+"Videoservers. Die Datei wird für den Videoserver nicht lesbar sein. Wollen "
+"Sie wirklich fortfahren?"
 
 #: utils_videotl.cc:56
 msgid "Continue"
-msgstr ""
+msgstr "Fortfahren"
 
 #: utils_videotl.cc:62
-#, fuzzy
 msgid "Confirm Overwrite"
-msgstr "Bestätige das Überschreiben des Schnappschusses"
+msgstr "Bestätige das Überschreiben"
 
 #: utils_videotl.cc:63
-#, fuzzy
 msgid "A file with the same name already exists.  Do you want to overwrite it?"
 msgstr ""
-"Ein Schnappschuss mit diesem Namen existiert bereits. Wollen Sie ihn "
-"überschreiben?"
+"Eine Datei mit diesem Namen existiert bereits. Wollen Sie sie überschreiben?"
 
 #: utils_videotl.cc:73 utils_videotl.cc:89
-#, fuzzy
 msgid "Cannot create video folder \"%1\" (%2)"
-msgstr "Kann benutzerspezifischen %3-Ordner %1 nicht erstellen:  %2"
+msgstr "Kann Videoordner \"%1\" nicht erstellen (%2)"
 
 #: export_video_dialog.cc:65
-#, fuzzy
 msgid "Export Video File "
-msgstr "Exportiere Audio-Datei(en)..."
+msgstr "Exportiere Videodatei"
 
 #: export_video_dialog.cc:69
-#, fuzzy
 msgid "Video:"
-msgstr "Mike Start"
+msgstr "Video:"
 
 #: export_video_dialog.cc:73
 msgid "Scale Video (W x H):"
-msgstr ""
+msgstr "Skaliere Video (W x H):"
 
 #: export_video_dialog.cc:78
 msgid "Set Aspect Ratio:"
-msgstr ""
+msgstr "Seitenverhältnis:"
 
 #: export_video_dialog.cc:79
-#, fuzzy
 msgid "Normalize Audio"
-msgstr "Normalisieren auf:"
+msgstr "Audio normalisieren"
 
 #: export_video_dialog.cc:80
 msgid "2 Pass Encoding"
-msgstr ""
+msgstr "Enkodiere in 2 Durchgängen"
 
 #: export_video_dialog.cc:81
 msgid "Codec Optimizations:"
-msgstr ""
+msgstr "Codec-Optimierungen:"
 
 #: export_video_dialog.cc:83
-#, fuzzy
 msgid "Deinterlace"
-msgstr "Positionszeiger zentrieren"
+msgstr "Deinterlacing anwenden"
 
 #: export_video_dialog.cc:84
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
-msgstr ""
+msgstr "Verwende [2] B-frames (nur MPEG 2 oder 4)"
 
 #: export_video_dialog.cc:85
 msgid "Override FPS (Default is to retain FPS from the input video file):"
-msgstr ""
+msgstr "FPS erzwingen (Voreinstellung: FPS der Videodatei wird beibehalten):"
 
 #: export_video_dialog.cc:86
-#, fuzzy
 msgid "Include Session Metadata"
-msgstr "Projekt-Metadaten bearbeiten"
-
-#: export_video_dialog.cc:88
-msgid "Enable Debug Mode: Print ffmpeg Command & Output to stdout."
-msgstr ""
+msgstr "Projekt-Metadaten verwenden"
 
 #: export_video_dialog.cc:106
 msgid ""
@@ -12522,156 +12726,202 @@ msgid ""
 "is not possible until you install those tools. See the Log widow for more "
 "information."
 msgstr ""
+"Die Programme ffprobe oder ffmpeg konnten auf diesem System nicht gefunden "
+"werden. Bis diese Werkzeuge installiert sind, ist Videoexport nicht möglich. "
+"Sehen Sie im Log-Fenster nach weiteren Informationen."
 
 #: export_video_dialog.cc:116
-#, fuzzy
 msgid "<b>Output:</b>"
-msgstr "<b>Ausgänge</b>"
+msgstr "<b>Ausgang:</b>"
 
 #: export_video_dialog.cc:126
-#, fuzzy
 msgid "<b>Input:</b>"
-msgstr "<b>Eingänge</b>"
+msgstr "<b>Eingang:</b>"
 
 #: export_video_dialog.cc:137
-#, fuzzy
 msgid "Audio:"
-msgstr "Audio"
+msgstr "Audio:"
 
 #: export_video_dialog.cc:139
-#, fuzzy
 msgid "Master Bus"
-msgstr "der Master-Bus"
+msgstr "Masterbus"
+
+#: export_video_dialog.cc:144
+msgid "from the %1 session's start to the session's end"
+msgstr "von %1 Projektbeginn bis -ende"
+
+#: export_video_dialog.cc:148
+msgid "from 00:00:00:00 to the video's end"
+msgstr "von 00:00:00:00 bis Videoende"
 
-#: export_video_dialog.cc:166
-#, fuzzy
+#: export_video_dialog.cc:150
+msgid "from the video's start to the video's end"
+msgstr "von Videostart bis Videoende"
+
+#: export_video_dialog.cc:183
 msgid "<b>Settings:</b>"
-msgstr "<b>Ziele</b>"
+msgstr "<b>Einstellungen:</b>"
 
-#: export_video_dialog.cc:174
-#, fuzzy
+#: export_video_dialog.cc:191
 msgid "Range:"
-msgstr "Bereiche"
+msgstr "Bereich:"
 
-#: export_video_dialog.cc:177
-#, fuzzy
+#: export_video_dialog.cc:194
 msgid "Preset:"
-msgstr "Preset"
+msgstr "Preset:"
 
-#: export_video_dialog.cc:180
-#, fuzzy
+#: export_video_dialog.cc:197
 msgid "Video Codec:"
-msgstr "Ordner:"
+msgstr "Videocodec:"
 
-#: export_video_dialog.cc:183
-#, fuzzy
+#: export_video_dialog.cc:200
 msgid "Video KBit/s:"
-msgstr "Mike Start"
+msgstr "Video KBit/s:"
 
-#: export_video_dialog.cc:186
-#, fuzzy
+#: export_video_dialog.cc:203
 msgid "Audio Codec:"
-msgstr "Audio-Modus:"
+msgstr "Audiocodec:"
 
-#: export_video_dialog.cc:189
-#, fuzzy
+#: export_video_dialog.cc:206
 msgid "Audio KBit/s:"
-msgstr "Audiodateien"
+msgstr "Audio KBit/s:"
 
-#: export_video_dialog.cc:192
-#, fuzzy
+#: export_video_dialog.cc:209
 msgid "Audio Samplerate:"
-msgstr "Samplerate:"
+msgstr "Audiosamplerate:"
 
-#: export_video_dialog.cc:369
-#, fuzzy
+#: export_video_dialog.cc:386
 msgid "Normalizing audio"
-msgstr "Normalisieren"
+msgstr "Audio normalisieren"
 
-#: export_video_dialog.cc:373
-#, fuzzy
+#: export_video_dialog.cc:390
 msgid "Exporting audio"
-msgstr "Audio exportieren"
+msgstr "Exportiere Audio"
 
-#: export_video_dialog.cc:419
-#, fuzzy
-msgid "Exporting Audio.."
-msgstr "Audio exportieren"
+#: export_video_dialog.cc:436
+msgid "Exporting Audio..."
+msgstr "Exportiere Audio..."
 
-#: export_video_dialog.cc:476
+#: export_video_dialog.cc:493
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
 msgstr ""
+"Exportiere Video: Kann die Dauer der Videodatei nicht eruieren, verwende "
+"statt dessen die Dauer aus der Zeitleiste."
 
-#: export_video_dialog.cc:505
+#: export_video_dialog.cc:522
 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:544
-msgid "Encoding Video.."
-msgstr ""
+#: export_video_dialog.cc:561
+msgid "Encoding Video..."
+msgstr "Enkodiere Video..."
 
-#: export_video_dialog.cc:563
+#: export_video_dialog.cc:580
 msgid "Export Video: Video input file cannot be read."
-msgstr ""
+msgstr "Exportiere Video: Die Videoquelldatei kann nicht gelesen werden."
 
-#: export_video_dialog.cc:661
+#: export_video_dialog.cc:678
 msgid "Encoding Video.. Pass 1/2"
-msgstr ""
+msgstr "Kodiere Video.. Durchgang 1/2"
 
-#: export_video_dialog.cc:673
+#: export_video_dialog.cc:690
 msgid "Encoding Video.. Pass 2/2"
-msgstr ""
+msgstr "Kodiere Video.. Durchgang 2/2"
 
-#: export_video_dialog.cc:761
+#: export_video_dialog.cc:778
 msgid "Transcoding failed."
-msgstr ""
+msgstr "Transkodieren fehlgeschlagen."
 
-#: export_video_dialog.cc:930 export_video_dialog.cc:950
-#, fuzzy
+#: export_video_dialog.cc:947 export_video_dialog.cc:967
 msgid "Save Exported Video File"
-msgstr "Exportiere Audio-Datei(en)..."
+msgstr "Sichere exportierte Videodatei"
 
 #: export_video_infobox.cc:30
-#, fuzzy
 msgid "Video Export Info"
-msgstr "Monitor"
+msgstr "Video-Exportinformationen"
 
 #: export_video_infobox.cc:31
 msgid "Do Not Show This Dialog Again (Reset in Edit > Preferences > Video)."
 msgstr ""
+"Diesen Dialog nicht wieder anzeigen (kann in Bearbeiten > Globale "
+"Einstellungen > Video zurückgesetzt werden)."
 
 #: export_video_infobox.cc:43
 msgid "<b>Video Export Info</b>"
-msgstr ""
+msgstr "<b>Videoexport Informationen</b>"
 
-#: export_video_infobox.cc:46
+#: export_video_infobox.cc:48
 msgid ""
-"Ardour video export is not recommended for mastering!\n"
-"While 'ffmpeg' (which is used by ardour) can produce high-quality files, "
-"this export lacks the possibility to tweak many settings. We recommend to "
-"use 'winff', 'devede' or 'dvdauthor' to mux & master. Nevertheless this "
-"video-export comes in handy to do quick snapshots, intermediates, dailies or "
-"online videos.\n"
+"Video encoding is a non-trivial task with many details.\n"
 "\n"
-"The soundtrack is created from the master-bus of the current Ardour "
-"session.\n"
+"Please see the manual at %1/video-timeline/operations/#export.\n"
 "\n"
-"The video soure defaults to the file used in the video timeline, which may "
-"not the best quality to start with, you should the original video file.\n"
+"Open Manual in Browser? "
+msgstr ""
+"Das Kodieren von Video ist eine komplexe Aufgabe mit vielen Details.\n"
 "\n"
-"If the export-range is longer than the original video, black video frames "
-"are prefixed and/or appended. This process may fail with non-standard pixel-"
-"aspect-ratios.\n"
+"Lesen Sie bitte darüber im Handbuch unter %1/video-timeline/operations/"
+"#export nach.\n"
 "\n"
-"The file-format is determined by the extension that you choose for the "
-"output file (.avi, .mov, .flv, .ogv,...)\n"
-"Note: not all combinations of format+codec+settings produce files which are "
-"according so spec. e.g. flv files require sample-rates of 22.1kHz or "
-"44.1kHz, mpeg containers can not be used with ac3 audio-codec, etc. If in "
-"doubt, use one of the built-in presets."
-msgstr ""
+"Handbuch im Browser öffnen? "
+
+#~ msgid "Failed to set session-framerate: "
+#~ msgstr "Konnte Projekt-Framerate nicht einstellen: "
+
+#~ msgid " vs "
+#~ msgstr " vs. "
+
+#~ msgid "-24dB"
+#~ msgstr "-24dB"
+
+#~ msgid "-15dB"
+#~ msgstr "-15dB"
+
+#~ msgid "Configure meter-ticks and color-knee point."
+#~ msgstr "Maßstriche und Farbbereiche der Pegelanzeige konfigurieren"
+
+#~ msgid "Enable Debug Mode: Print ffmpeg Command & Output to stdout."
+#~ msgstr ""
+#~ "Debug-Modus einschalten: gibt die ffmpeg-Befehlszeile und -Ausgabe an "
+#~ "stdout aus."
+
+#~ msgid "-Inf"
+#~ msgstr "-Inf"
+
+#~ msgid "slowest"
+#~ msgstr "Am langsamstem"
+
+#~ msgid "slow"
+#~ msgstr "Langsam"
+
+#~ msgid "fast"
+#~ msgstr "Schnell"
+
+#~ msgid "faster"
+#~ msgstr "Schneller"
+
+#~ msgid "fastest"
+#~ msgstr "Schnellstmöglich"
+
+#~ msgid "found %1 match"
+#~ msgid_plural "found %1 matches"
+#~ msgstr[0] "%1 Treffer gefunden"
+#~ msgstr[1] "%1 Treffer gefunden"
+
+#~ msgid "Search returned no results."
+#~ msgstr "Die Suche erbrachte keine Ergebnisse"
+
+#~ msgid "Found %1 match"
+#~ msgid_plural "Found %1 matches"
+#~ msgstr[0] "%1 Treffer gefunden"
+#~ msgstr[1] "%1 Treffer gefunden"
+
+#~ msgid "What would you like to do ?"
+#~ msgstr "Was möchten Sie tun?"
 
 #~ msgid "Connect"
 #~ msgstr "Verbinden"
diff --git a/gtk2_ardour/po/ru.po b/gtk2_ardour/po/ru.po
index b76137b..3c81be6 100644
--- a/gtk2_ardour/po/ru.po
+++ b/gtk2_ardour/po/ru.po
@@ -10,18 +10,18 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Ardour 3\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-06-11 08:49-0400\n"
-"PO-Revision-Date: 2013-03-05 03:23+0300\n"
+"POT-Creation-Date: 2013-07-14 15:01+0400\n"
+"PO-Revision-Date: 2013-07-14 18:04+0300\n"
 "Last-Translator: Александр Прокудин <alexandre.prokoudine at gmail.com>\n"
 "Language-Team: русский <>\n"
 "Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
+"X-Generator: Poedit 1.5.4\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); 10<=4 && (n%100<10 || n"
-"%100>=20) ? 1 : 2);\n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"%100>=20) ? 1: 2);\n"
 
 #: about.cc:122
 msgid "Brian Ahr"
@@ -149,7 +149,7 @@ msgstr "Armand Klenk"
 
 #: about.cc:153
 msgid "Julien de Kozak"
-msgstr ""
+msgstr "Julien de Kozak"
 
 #: about.cc:154
 msgid "Matt Krai"
@@ -262,7 +262,6 @@ msgstr ""
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 
 #: about.cc:183
-#, fuzzy
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -276,10 +275,11 @@ msgstr ""
 "Немецкий:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
 "\tSebastian Arnold <mail at sebastian-arnold.net>\n"
-"\tRobert Schwede<schwede at ironshark.com>\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:190
 msgid ""
@@ -413,7 +413,7 @@ msgstr "%1 menu definition file not found"
 msgid "%1 will not work without a valid ardour.menus file"
 msgstr "%1 will not work without a valid ardour.menus file"
 
-#: add_route_dialog.cc:53 route_params_ui.cc:503
+#: add_route_dialog.cc:53 route_params_ui.cc:499
 msgid "Add Track or Bus"
 msgstr "Добавить дорожку или шину"
 
@@ -506,7 +506,7 @@ msgstr ""
 "звуковые и MIDI-дорожки."
 
 #: add_route_dialog.cc:319 add_route_dialog.cc:338 editor_actions.cc:385
-#: editor_rulers.cc:377 time_axis_view.cc:1301
+#: editor_rulers.cc:377 time_axis_view.cc:1304
 msgid "Normal"
 msgstr "Нормальная"
 
@@ -550,7 +550,7 @@ msgstr "8 каналов"
 msgid "12 Channel"
 msgstr "3 канала"
 
-#: add_route_dialog.cc:475 mixer_strip.cc:2136
+#: add_route_dialog.cc:475 mixer_strip.cc:2130
 msgid "Custom"
 msgstr "На заказ"
 
@@ -638,7 +638,7 @@ msgid "Track"
 msgstr "Дорожка"
 
 #: analysis_window.cc:68 editor_actions.cc:616 mixer_ui.cc:125
-#: mixer_ui.cc:1793
+#: mixer_ui.cc:1795
 msgid "Show"
 msgstr "Показать"
 
@@ -646,94 +646,91 @@ msgstr "Показать"
 msgid "Re-analyze data"
 msgstr "Повторно проанализировать данные"
 
-#: ardour_button.cc:658
+#: ardour_button.cc:704
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr ""
 
-#: ardour_ui.cc:179
+#: ardour_ui.cc:180
 msgid "audition"
 msgstr "прослушивание"
 
-#: ardour_ui.cc:180
+#: ardour_ui.cc:181
 msgid "solo"
 msgstr "солирование"
 
-#: ardour_ui.cc:181
+#: ardour_ui.cc:182
 msgid "feedback"
 msgstr "отклик"
 
-#: ardour_ui.cc:183 speaker_dialog.cc:36
+#: ardour_ui.cc:184 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr "Конфигурация громкоговорителей"
 
-#: ardour_ui.cc:184 theme_manager.cc:56 theme_manager.cc:64
+#: ardour_ui.cc:185 theme_manager.cc:56 theme_manager.cc:64
 msgid "Theme Manager"
 msgstr "Стиль оформления"
 
-#: ardour_ui.cc:185 keyeditor.cc:53
+#: ardour_ui.cc:186 keyeditor.cc:53
 msgid "Key Bindings"
 msgstr "Клавиатурные комбинации"
 
-#: ardour_ui.cc:186
+#: ardour_ui.cc:187
 msgid "Preferences"
 msgstr "Параметры"
 
-#: ardour_ui.cc:187 ardour_ui.cc:192
-#, fuzzy
+#: ardour_ui.cc:188 ardour_ui.cc:193
 msgid "Add Tracks/Busses"
-msgstr "Дорожки/Шины"
+msgstr "Добавить дорожки/шины"
 
-#: ardour_ui.cc:188
+#: ardour_ui.cc:189
 msgid "About"
 msgstr "О программе"
 
-#: ardour_ui.cc:189 location_ui.cc:1134
+#: ardour_ui.cc:190 location_ui.cc:1146
 msgid "Locations"
 msgstr "Позиции"
 
-#: ardour_ui.cc:190 route_params_ui.cc:57 route_params_ui.cc:604
+#: ardour_ui.cc:191 route_params_ui.cc:57 route_params_ui.cc:600
 msgid "Tracks and Busses"
 msgstr "Дорожки и шины"
 
-#: ardour_ui.cc:191
+#: ardour_ui.cc:192
 msgid "Properties"
 msgstr "Свойства"
 
-#: ardour_ui.cc:193 bundle_manager.cc:263
+#: ardour_ui.cc:194 bundle_manager.cc:263
 msgid "Bundle Manager"
 msgstr "Управление пакетами"
 
-#: ardour_ui.cc:194 big_clock_window.cc:35
+#: ardour_ui.cc:195 big_clock_window.cc:35
 msgid "Big Clock"
 msgstr "Большой счётчик"
 
-#: ardour_ui.cc:195
-#, fuzzy
+#: ardour_ui.cc:196
 msgid "Audio Connections"
-msgstr "Входные соединения"
+msgstr "Звуковые соединения"
 
-#: ardour_ui.cc:196
-#, fuzzy
+#: ardour_ui.cc:197
 msgid "MIDI Connections"
-msgstr "Входные соединения"
+msgstr "Соединения MIDI"
 
-#: ardour_ui.cc:198
+#: ardour_ui.cc:199
 msgid "Errors"
 msgstr "Ошибки"
 
-#: ardour_ui.cc:299
+#: ardour_ui.cc:301
 msgid "could not initialize %1."
 msgstr "Не удалось инициализировать %1."
 
-#: ardour_ui.cc:394
+#: ardour_ui.cc:396
 msgid "Starting audio engine"
 msgstr "Запускается звуковой движок"
 
-#: ardour_ui.cc:763 startup.cc:638
+#: ardour_ui.cc:766 startup.cc:638
 msgid "%1 is ready for use"
 msgstr "%1 готов к работе"
 
-#: ardour_ui.cc:811
+#: ardour_ui.cc:814
 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"
@@ -748,23 +745,23 @@ msgstr ""
 "Вы можете узнать установленный предел при помощи команды 'ulimit -l'. Обычно "
 "это контролируется в %2."
 
-#: ardour_ui.cc:828
+#: ardour_ui.cc:831
 msgid "Do not show this window again"
 msgstr "Больше не показывать это окно"
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:873
 msgid "Don't quit"
 msgstr "Не выходить"
 
-#: ardour_ui.cc:871
+#: ardour_ui.cc:874
 msgid "Just quit"
 msgstr "Просто выйти"
 
-#: ardour_ui.cc:872
+#: ardour_ui.cc:875
 msgid "Save and quit"
 msgstr "Сохранить и выйти"
 
-#: ardour_ui.cc:882
+#: ardour_ui.cc:885
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -779,15 +776,15 @@ msgstr ""
 "\n"
 "«Просто выйти»."
 
-#: ardour_ui.cc:913
+#: ardour_ui.cc:916
 msgid "Please wait while %1 cleans up..."
 msgstr "Дождитесь завершения подчистки сеанса в %1..."
 
-#: ardour_ui.cc:930
+#: ardour_ui.cc:933
 msgid "Unsaved Session"
 msgstr "Сеанс не сохранён"
 
-#: ardour_ui.cc:951
+#: ardour_ui.cc:954
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -805,7 +802,7 @@ msgstr ""
 "\n"
 "Что вы хотите сделать?"
 
-#: ardour_ui.cc:954
+#: ardour_ui.cc:957
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -823,74 +820,74 @@ msgstr ""
 "\n"
 "Что вы хотите сделать?"
 
-#: ardour_ui.cc:968
+#: ardour_ui.cc:971
 msgid "Prompter"
 msgstr ""
 
-#: ardour_ui.cc:1045
+#: ardour_ui.cc:1048
 msgid "disconnected"
 msgstr "отсоединено"
 
-#: ardour_ui.cc:1052
+#: ardour_ui.cc:1055
 #, c-format
 msgid "JACK: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr "JACK: <span foreground=\"green\">%.1f КГц / %4.1f мс</span>"
 
-#: ardour_ui.cc:1056
+#: ardour_ui.cc:1059
 #, c-format
 msgid "JACK: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr "JACK: <span foreground=\"green\">%<PRId64> КГц / %4.1f мс</span>"
 
-#: ardour_ui.cc:1074 export_video_dialog.cc:67
+#: ardour_ui.cc:1077 export_video_dialog.cc:67
 msgid "File:"
 msgstr "Файл:"
 
-#: ardour_ui.cc:1078
+#: ardour_ui.cc:1081
 msgid "BWF"
 msgstr "BWF"
 
-#: ardour_ui.cc:1081
+#: ardour_ui.cc:1084
 msgid "WAV"
 msgstr "WAV"
 
-#: ardour_ui.cc:1084
+#: ardour_ui.cc:1087
 msgid "WAV64"
 msgstr "WAV64"
 
-#: ardour_ui.cc:1087 session_option_editor.cc:197
+#: ardour_ui.cc:1090 session_option_editor.cc:197
 msgid "CAF"
 msgstr "CAF"
 
-#: ardour_ui.cc:1090
+#: ardour_ui.cc:1093
 msgid "AIFF"
 msgstr "AIFF"
 
-#: ardour_ui.cc:1093
+#: ardour_ui.cc:1096
 msgid "iXML"
 msgstr "iXML"
 
-#: ardour_ui.cc:1096
+#: ardour_ui.cc:1099
 msgid "RF64"
 msgstr "RF64"
 
-#: ardour_ui.cc:1104
+#: ardour_ui.cc:1107
 msgid "32-float"
 msgstr "32-float"
 
-#: ardour_ui.cc:1107
+#: ardour_ui.cc:1110
 msgid "24-int"
 msgstr "24-int"
 
-#: ardour_ui.cc:1110
+#: ardour_ui.cc:1113
 msgid "16-int"
 msgstr "16-int"
 
-#: ardour_ui.cc:1129
+#: ardour_ui.cc:1132
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr "ЦП: <span foreground=\"%s\">%5.1f%%</span>"
 
-#: ardour_ui.cc:1148
+#: ardour_ui.cc:1151
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -901,33 +898,33 @@ msgstr ""
 "%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
 "%<PRIu32>%%</span>"
 
-#: ardour_ui.cc:1184
+#: ardour_ui.cc:1187
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr "На диске: <span foreground=\"green\">неизвестно</span>"
 
-#: ardour_ui.cc:1186
+#: ardour_ui.cc:1189
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr "На диске: <span foreground=\"green\">24ч+</span>"
 
-#: ardour_ui.cc:1204
+#: ardour_ui.cc:1207
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr "На диске: <span foreground=\"green\">>24ч</span>"
 
-#: ardour_ui.cc:1215
+#: ardour_ui.cc:1218
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr "На диске:  <span foreground=\"%s\">%02dч:%02dм:%02dс</span>"
 
-#: ardour_ui.cc:1241
+#: ardour_ui.cc:1244
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr "ТК: <span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1358 ardour_ui.cc:1367 startup.cc:1045
+#: ardour_ui.cc:1361 ardour_ui.cc:1370 startup.cc:1045
 msgid "Recent Sessions"
 msgstr "Недавние сеансы"
 
-#: ardour_ui.cc:1447
+#: ardour_ui.cc:1450
 msgid ""
 "%1 is not connected to JACK\n"
 "You cannot open or close sessions in this condition"
@@ -935,27 +932,27 @@ msgstr ""
 "%1 не соединен с JACK.\n"
 "Открытие и закрытие сеансов невозможно."
 
-#: ardour_ui.cc:1474
+#: ardour_ui.cc:1477
 msgid "Open Session"
 msgstr "Открыть сеанс"
 
-#: ardour_ui.cc:1492 session_import_dialog.cc:169
+#: ardour_ui.cc:1495 session_import_dialog.cc:169
 #: session_metadata_dialog.cc:729 startup.cc:1074
 msgid "%1 sessions"
 msgstr "Cеансы %1"
 
-#: ardour_ui.cc:1529
+#: ardour_ui.cc:1532
 msgid "You cannot add a track without a session already loaded."
 msgstr "Вы не можете добавить дорожку без загруженного сеанса."
 
-#: ardour_ui.cc:1537
+#: ardour_ui.cc:1540
 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:1543 ardour_ui.cc:1604
+#: ardour_ui.cc:1546 ardour_ui.cc:1607
 msgid ""
 "There are insufficient JACK ports available\n"
 "to create a new track or bus.\n"
@@ -967,25 +964,25 @@ msgstr ""
 "Необходимо сохранить %1, выйти и запустить\n"
 "JACK с увеличенным количеством портов."
 
-#: ardour_ui.cc:1578
+#: ardour_ui.cc:1581
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr "Вы не можете добавить дорожку или шину без открытого сеанса."
 
-#: ardour_ui.cc:1587
+#: ardour_ui.cc:1590
 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:1596
+#: ardour_ui.cc:1599
 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:1713
+#: ardour_ui.cc:1716
 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."
@@ -994,14 +991,14 @@ msgstr ""
 "как пытаться что-либо записать.\n"
 "Используйте меню «Сеанс > Добавить дорожку/шину»."
 
-#: ardour_ui.cc:2103
+#: ardour_ui.cc:2106
 msgid ""
 "The audio backend (JACK) was shutdown because:\n"
 "\n"
 "%1"
 msgstr ""
 
-#: ardour_ui.cc:2105
+#: ardour_ui.cc:2108
 msgid ""
 "JACK has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -1012,19 +1009,19 @@ msgstr ""
 "с %1 и отсоединил его. Необходимо перезапустить \n"
 "JACK, восстановить соединение и сохранить сеанс."
 
-#: ardour_ui.cc:2131
+#: ardour_ui.cc:2134
 msgid "Unable to start the session running"
 msgstr "Невозможно запустить уже выполняемый сеанс"
 
-#: ardour_ui.cc:2211
+#: ardour_ui.cc:2214
 msgid "Take Snapshot"
 msgstr "Создать снимок"
 
-#: ardour_ui.cc:2212
+#: ardour_ui.cc:2215
 msgid "Name of new snapshot"
 msgstr "Название нового снимка"
 
-#: ardour_ui.cc:2236
+#: ardour_ui.cc:2239
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
@@ -1032,27 +1029,27 @@ msgstr ""
 "Для обеспечения совместимости с различными системами\n"
 "названия снимков не могут содержать символ '%1'."
 
-#: ardour_ui.cc:2248
+#: ardour_ui.cc:2251
 msgid "Confirm Snapshot Overwrite"
 msgstr "Подтвердите перезапись снимка"
 
-#: ardour_ui.cc:2249
+#: ardour_ui.cc:2252
 msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
 msgstr "Снимок с таким названием уже есть. Перезаписать его?"
 
-#: ardour_ui.cc:2252 utils_videotl.cc:66
+#: ardour_ui.cc:2255 utils_videotl.cc:66
 msgid "Overwrite"
 msgstr "Перезаписать"
 
-#: ardour_ui.cc:2286
+#: ardour_ui.cc:2289
 msgid "Rename Session"
 msgstr "Переименовать сеанс"
 
-#: ardour_ui.cc:2287
+#: ardour_ui.cc:2290
 msgid "New session name"
 msgstr "Новое название сеанса"
 
-#: ardour_ui.cc:2301 ardour_ui.cc:2681 ardour_ui.cc:2726
+#: ardour_ui.cc:2304 ardour_ui.cc:2684 ardour_ui.cc:2729
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
@@ -1060,12 +1057,12 @@ msgstr ""
 "Для обеспечения совместимости с различными системами\n"
 "названия сеансов не могут содержать символ '%1'."
 
-#: ardour_ui.cc:2309
+#: ardour_ui.cc:2312
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr ""
 
-#: ardour_ui.cc:2318
+#: ardour_ui.cc:2321
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
@@ -1073,19 +1070,19 @@ msgstr ""
 "Не удалось переименовать этот сеанс.\n"
 "Очень может быть, что всё испортилось."
 
-#: ardour_ui.cc:2429
+#: ardour_ui.cc:2432
 msgid "Save Template"
 msgstr "Сохранить шаблон"
 
-#: ardour_ui.cc:2430
+#: ardour_ui.cc:2433
 msgid "Name for template:"
 msgstr "Название шаблона:"
 
-#: ardour_ui.cc:2431
+#: ardour_ui.cc:2434
 msgid "-template"
 msgstr "-шаблон"
 
-#: ardour_ui.cc:2469
+#: ardour_ui.cc:2472
 msgid ""
 "This session\n"
 "%1\n"
@@ -1095,52 +1092,52 @@ msgstr ""
 "%1\n"
 "уже существует. Открыть его?"
 
-#: ardour_ui.cc:2479
+#: ardour_ui.cc:2482
 msgid "Open Existing Session"
 msgstr "Открыть существующий сеанс"
 
-#: ardour_ui.cc:2717
+#: ardour_ui.cc:2720
 msgid "There is no existing session at \"%1\""
 msgstr "По адресу \"%1\" не существующего сеанса"
 
-#: ardour_ui.cc:2804
+#: ardour_ui.cc:2807
 msgid "Please wait while %1 loads your session"
 msgstr "Дождитесь завершения загрузки сеанса в %1"
 
-#: ardour_ui.cc:2819
+#: ardour_ui.cc:2822
 msgid "Port Registration Error"
 msgstr "Ошибка регистрации порта"
 
-#: ardour_ui.cc:2820
+#: ardour_ui.cc:2823
 msgid "Click the Close button to try again."
 msgstr "Щелкните кнопку «Закрыть» для возврата к предыдущему диалогу."
 
-#: ardour_ui.cc:2841
+#: ardour_ui.cc:2844
 msgid "Session \"%1 (snapshot %2)\" did not load successfully"
 msgstr "Не удалось загрузить сеанс \"%1 (снимок %2)\""
 
-#: ardour_ui.cc:2847
+#: ardour_ui.cc:2850
 msgid "Loading Error"
 msgstr "Ошибка при загрузке"
 
-#: ardour_ui.cc:2848
+#: ardour_ui.cc:2851
 msgid "Click the Refresh button to try again."
 msgstr "Щёлкните кнопку «Обновить» для повторной попытки."
 
-#: ardour_ui.cc:2930
+#: ardour_ui.cc:2933
 msgid "Could not create session in \"%1\""
 msgstr "Не удалось создать сеанс «%1»"
 
-#: ardour_ui.cc:3030
+#: ardour_ui.cc:3033
 msgid "No files were ready for clean-up"
 msgstr "Нет готовых к удалению звуковых файлов"
 
-#: ardour_ui.cc:3034 ardour_ui.cc:3044 ardour_ui.cc:3177 ardour_ui.cc:3184
+#: ardour_ui.cc:3037 ardour_ui.cc:3047 ardour_ui.cc:3180 ardour_ui.cc:3187
 #: ardour_ui_ed.cc:104
 msgid "Clean-up"
 msgstr "Очистить"
 
-#: ardour_ui.cc:3035
+#: ardour_ui.cc:3038
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1152,19 +1149,19 @@ msgstr ""
 "Они могут включать области, которым\n"
 "нужны неиспользуемые файлы."
 
-#: ardour_ui.cc:3094
+#: ardour_ui.cc:3097
 msgid "kilo"
 msgstr "кило"
 
-#: ardour_ui.cc:3097
+#: ardour_ui.cc:3100
 msgid "mega"
 msgstr "мега"
 
-#: ardour_ui.cc:3100
+#: ardour_ui.cc:3103
 msgid "giga"
 msgstr "гига"
 
-#: ardour_ui.cc:3105
+#: ardour_ui.cc:3108
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1184,7 +1181,7 @@ msgstr[2] ""
 "освободив при этом %3 %4байт\n"
 "дискового пространства."
 
-#: ardour_ui.cc:3112
+#: ardour_ui.cc:3115
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1204,7 +1201,7 @@ msgid_plural ""
 "\n"
 "will release an additional %3 %4bytes of disk space.\n"
 msgstr[0] ""
-"Следующий %1 файл не используется и перемещён в пвпку\n"
+"Следующий %1 файл не используется и перемещён в папку\n"
 "%2\n"
 "\n"
 "После повторного запуска %5 команда\n"
@@ -1213,7 +1210,7 @@ msgstr[0] ""
 "\n"
 "дополнительно освободит %3 %4байт дискового пространства.\n"
 msgstr[1] ""
-"Следующие %1 файла не используются и перемещён в пвпку\n"
+"Следующие %1 файла не используются и перемещены в папку\n"
 "%2\n"
 "\n"
 "После повторного запуска %5 команда\n"
@@ -1222,7 +1219,7 @@ msgstr[1] ""
 "\n"
 "дополнительно освободит %3 %4байт дискового пространства.\n"
 msgstr[2] ""
-"Следующие %1 файлов не используются и перемещён в пвпку\n"
+"Следующие %1 файлов не используются и перемещены в папку\n"
 "%2\n"
 "\n"
 "После повторного запуска %5 команда\n"
@@ -1231,11 +1228,11 @@ msgstr[2] ""
 "\n"
 "дополнительно освободит %3 %4байт дискового пространства.\n"
 
-#: ardour_ui.cc:3172
+#: ardour_ui.cc:3175
 msgid "Are you sure you want to clean-up?"
 msgstr "Вы уверены, что хотите выполнить очистку?"
 
-#: ardour_ui.cc:3179
+#: ardour_ui.cc:3182
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
@@ -1246,82 +1243,80 @@ msgstr ""
 "неиспользуемые звуковые файлы\n"
 "будут перемещены в «мертвую» зону."
 
-#: ardour_ui.cc:3187
+#: ardour_ui.cc:3190
 msgid "CleanupDialog"
 msgstr "Очистка"
 
-#: ardour_ui.cc:3217
+#: ardour_ui.cc:3220
 msgid "Cleaned Files"
 msgstr "Очищенные файлы"
 
-#: ardour_ui.cc:3234
+#: ardour_ui.cc:3237
 msgid "deleted file"
 msgstr "удалён файл"
 
-#: ardour_ui.cc:3326
+#: ardour_ui.cc:3329
 msgid ""
 "Video-Server was not launched by Ardour. The request to stop it is ignored."
 msgstr ""
 
-#: ardour_ui.cc:3330
+#: ardour_ui.cc:3333
 msgid "Stop Video-Server"
 msgstr ""
 
-#: ardour_ui.cc:3331
-#, fuzzy
+#: ardour_ui.cc:3334
 msgid "Do you really want to stop the Video Server?"
-msgstr "Вы действительно хотите удалить %1 %2?"
+msgstr "Вы действительно хотите остановить видеосервер?"
 
-#: ardour_ui.cc:3334
-#, fuzzy
+#: ardour_ui.cc:3337
 msgid "Yes, Stop It"
-msgstr "Да"
+msgstr "Да, остановить"
 
-#: ardour_ui.cc:3360
+#: ardour_ui.cc:3363
 msgid "The Video Server is already started."
 msgstr ""
 
-#: ardour_ui.cc:3362
+#: ardour_ui.cc:3365
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
 msgstr ""
 
-#: ardour_ui.cc:3370 ardour_ui.cc:3455
+#: ardour_ui.cc:3373 ardour_ui.cc:3463
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Edit -> Preferences."
 msgstr ""
 
-#: ardour_ui.cc:3394
+#: ardour_ui.cc:3397
 msgid "Specified docroot is not an existing directory."
 msgstr ""
 
-#: ardour_ui.cc:3399
+#: ardour_ui.cc:3402
 msgid "Given Video Server is not an executable file."
 msgstr ""
 
-#: ardour_ui.cc:3432
+#: ardour_ui.cc:3435
 msgid "Cannot launch the video-server"
-msgstr ""
+msgstr "Не удалось запустить видеосервер"
 
-#: ardour_ui.cc:3441
+#: ardour_ui.cc:3444
 msgid "Video-server was started but does not respond to requests..."
 msgstr ""
 
-#: ardour_ui.cc:3477 editor_audio_import.cc:629
+#: ardour_ui.cc:3489 editor_audio_import.cc:629
 msgid "could not open %1"
 msgstr "не удалось открыть %1"
 
-#: ardour_ui.cc:3481
+#: ardour_ui.cc:3493
 msgid "no video-file selected"
 msgstr ""
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:3658
 msgid "Recording was stopped because your system could not keep up."
 msgstr "Запись остановлена из-за недостаточного быстродействия системы"
 
-#: ardour_ui.cc:3670
+#: ardour_ui.cc:3687
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1335,7 +1330,7 @@ msgstr ""
 "В частности ей не удалось записать данные на диск\n"
 "достаточно быстро для фиксации захваченных данных.\n"
 
-#: ardour_ui.cc:3689
+#: ardour_ui.cc:3706
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1349,11 +1344,11 @@ msgstr ""
 "В частности ей не удалось прочитать данные\n"
 "с диска достаточно быстро для воспроизведения.\n"
 
-#: ardour_ui.cc:3729
+#: ardour_ui.cc:3746
 msgid "Crash Recovery"
 msgstr "Восстановление данных"
 
-#: ardour_ui.cc:3730
+#: ardour_ui.cc:3747
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1369,19 +1364,19 @@ msgstr ""
 "%1 может восстановить записанные данные,\n"
 "либо проигнорировать их. Примите решение.\n"
 
-#: ardour_ui.cc:3742
+#: ardour_ui.cc:3759
 msgid "Ignore crash data"
 msgstr "Проигнорировать"
 
-#: ardour_ui.cc:3743
+#: ardour_ui.cc:3760
 msgid "Recover from crash"
 msgstr "Восстановить данные"
 
-#: ardour_ui.cc:3763
+#: ardour_ui.cc:3780
 msgid "Sample Rate Mismatch"
 msgstr "Несовпадение частот сэмплирования"
 
-#: ardour_ui.cc:3764
+#: ardour_ui.cc:3781
 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"
@@ -1393,23 +1388,23 @@ msgstr ""
 "Если вы загрузите этот сеанс, звуковые данные могут быть\n"
 "воспроизведены с некорректной частотой сэмплирования.\n"
 
-#: ardour_ui.cc:3773
+#: ardour_ui.cc:3790
 msgid "Do not load session"
 msgstr "Не загружать сеанс"
 
-#: ardour_ui.cc:3774
+#: ardour_ui.cc:3791
 msgid "Load session anyway"
 msgstr "Все равно загрузить"
 
-#: ardour_ui.cc:3797
+#: ardour_ui.cc:3814
 msgid "Could not disconnect from JACK"
 msgstr "Не удалось отсоединиться от сервера JACK"
 
-#: ardour_ui.cc:3810
+#: ardour_ui.cc:3827
 msgid "Could not reconnect to JACK"
 msgstr "Не удалось соединиться с сервером JACK"
 
-#: ardour_ui.cc:4084
+#: ardour_ui.cc:4101
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1432,57 +1427,61 @@ msgstr "Интерфейс: не удалось инициализировать
 msgid "UI: cannot setup mixer"
 msgstr "Интерфейс: не удалось инициализировать микшер"
 
-#: ardour_ui2.cc:125
+#: ardour_ui2.cc:82
+msgid "UI: cannot setup meterbridge"
+msgstr "Интерфейс: не удалось настроить панель индикаторов"
+
+#: ardour_ui2.cc:130
 msgid "Play from playhead"
 msgstr "Воспроизвести от указателя"
 
-#: ardour_ui2.cc:126
+#: ardour_ui2.cc:131
 msgid "Stop playback"
 msgstr "Стоп"
 
-#: ardour_ui2.cc:127
+#: ardour_ui2.cc:132
 msgid "Toggle record"
 msgstr "Переключить готовность к записи"
 
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:133
 msgid "Play range/selection"
 msgstr "Воспроизвести выделение"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:134
 msgid "Go to start of session"
 msgstr "В начало сеанса"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:135
 msgid "Go to end of session"
 msgstr "В конец сеанса"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:136
 msgid "Play loop range"
 msgstr "Воспроизвести выделение в петле"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:137
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
 msgstr ""
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:138
 msgid "Return to last playback start when stopped"
 msgstr "Вернуться к точке начала воспроизведения"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:139
 msgid "Playhead follows Range Selections and Edits"
 msgstr "Указатель воспроизведения следует за выделением областей и правкам"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:140
 msgid "Be sensible about input monitoring"
 msgstr ""
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:141
 msgid "Enable/Disable audio click"
 msgstr "Включить или выключить метроном"
 
-#: ardour_ui2.cc:137 monitor_section.cc:101
+#: ardour_ui2.cc:142 monitor_section.cc:101
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1490,7 +1489,7 @@ msgstr ""
 "Включено, если какие-то дорожки солируют.\n"
 "Щёлкните, чтобы снять солирование везде."
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:143
 msgid ""
 "When active, auditioning is taking place\n"
 "Click to stop the audition"
@@ -1498,12 +1497,11 @@ msgstr ""
 "Включено, если выполняется прослушивание.\n"
 "Щёлкните, чтобы прекратить его."
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:144
 msgid "When active, there is a feedback loop."
 msgstr "Включена, когда есть петля отклика (feedback loop)"
 
-#: ardour_ui2.cc:140
-#, fuzzy
+#: ardour_ui2.cc:145
 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"
@@ -1515,11 +1513,8 @@ msgstr ""
 "или прокрутка колеса меняется значение.\n"
 "Прямой ввод: <tt>Esc</tt>: отмена; <tt>Enter</tt>: подтверждение; постфикс "
 "'+' или '-' вводит разницу во времени.\n"
-"Подробнее см. <span color=\"blue\">http://ardour.org/a3_features_clocks</"
-"span>."
 
-#: ardour_ui2.cc:141
-#, fuzzy
+#: ardour_ui2.cc:146
 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"
@@ -1531,30 +1526,28 @@ msgstr ""
 "вверх-вниз или прокрутка колеса меняется значение.\n"
 "Прямой ввод: <tt>Esc</tt>: отмена; <tt>Enter</tt>: подтверждение; постфикс "
 "'+' или '-' вводит разницу во времени.\n"
-"Подробнее см. <span color=\"blue\">http://ardour.org/a3_features_clocks</"
-"span>."
 
-#: ardour_ui2.cc:173
+#: ardour_ui2.cc:178
 msgid "[ERROR]: "
 msgstr "[ОШИБКА]: "
 
-#: ardour_ui2.cc:175
+#: ardour_ui2.cc:180
 msgid "[WARNING]: "
 msgstr "[ПРЕДУПРЕЖДЕНИЕ]:"
 
-#: ardour_ui2.cc:177
+#: ardour_ui2.cc:182
 msgid "[INFO]: "
 msgstr "[СПРАВКА]:"
 
-#: ardour_ui2.cc:241 ardour_ui_ed.cc:376
+#: ardour_ui2.cc:246 ardour_ui_ed.cc:377
 msgid "Auto Return"
 msgstr "Автовозврат"
 
-#: ardour_ui2.cc:243 ardour_ui_ed.cc:379
+#: ardour_ui2.cc:248 ardour_ui_ed.cc:380
 msgid "Follow Edits"
 msgstr "Следовать правкам"
 
-#: ardour_ui2.cc:621 rc_option_editor.cc:1004 rc_option_editor.cc:1022
+#: ardour_ui2.cc:626 rc_option_editor.cc:1004 rc_option_editor.cc:1022
 #: rc_option_editor.cc:1025 rc_option_editor.cc:1027 rc_option_editor.cc:1029
 #: rc_option_editor.cc:1037 rc_option_editor.cc:1045 rc_option_editor.cc:1047
 #: rc_option_editor.cc:1055 rc_option_editor.cc:1062 rc_option_editor.cc:1071
@@ -1574,23 +1567,23 @@ msgstr "Настройка редактора"
 msgid "Setup Mixer"
 msgstr "Настройка микшера"
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:85
 msgid "Reload Session History"
 msgstr "Повторная загрузка истории сеансов"
 
-#: ardour_ui_dialogs.cc:206
+#: ardour_ui_dialogs.cc:200
 msgid "Don't close"
 msgstr "Не закрывать"
 
-#: ardour_ui_dialogs.cc:207
+#: ardour_ui_dialogs.cc:201
 msgid "Just close"
 msgstr "Просто закрыть"
 
-#: ardour_ui_dialogs.cc:208
+#: ardour_ui_dialogs.cc:202
 msgid "Save and close"
 msgstr "Сохранить и закрыть"
 
-#: ardour_ui_dialogs.cc:293
+#: ardour_ui_dialogs.cc:291
 msgid "This screen is not tall enough to display the mixer window"
 msgstr "Размеров экрана недостаточно, чтобы показать окно микшера"
 
@@ -1655,7 +1648,7 @@ msgstr "Время задержки"
 msgid "Denormal Handling"
 msgstr "Обработка отклонений"
 
-#: ardour_ui_ed.cc:123 route_time_axis.cc:1475
+#: ardour_ui_ed.cc:123 route_time_axis.cc:1489
 msgid "New..."
 msgstr "Создать..."
 
@@ -1676,19 +1669,16 @@ msgid "Add Track or Bus..."
 msgstr "Добавить дорожку или шину..."
 
 #: ardour_ui_ed.cc:135
-#, fuzzy
 msgid "Open Video"
-msgstr "Открыть сеанс"
+msgstr "Добавить видео"
 
 #: ardour_ui_ed.cc:138
-#, fuzzy
 msgid "Remove Video"
-msgstr "Удалить выделение"
+msgstr "Удалить видео"
 
 #: ardour_ui_ed.cc:141
-#, fuzzy
 msgid "Export To Video File"
-msgstr "Экспортировать в файл"
+msgstr "Видеофайл"
 
 #: ardour_ui_ed.cc:145
 msgid "Snapshot..."
@@ -1698,8 +1688,8 @@ msgstr "Создать снимок..."
 msgid "Save As..."
 msgstr "Сохранить как..."
 
-#: ardour_ui_ed.cc:153 editor_actions.cc:1710 editor_markers.cc:858
-#: editor_snapshots.cc:123 mixer_strip.cc:1464 route_time_axis.cc:1471
+#: ardour_ui_ed.cc:153 editor_actions.cc:1719 editor_markers.cc:858
+#: editor_snapshots.cc:123 mixer_strip.cc:1470 route_time_axis.cc:1485
 msgid "Rename..."
 msgstr "Переименовать..."
 
@@ -1752,8 +1742,8 @@ msgstr "Задержка отклика"
 msgid "Reconnect"
 msgstr "Пересоединить"
 
-#: ardour_ui_ed.cc:195 global_port_matrix.cc:198 io_selector.cc:210
-#: mixer_strip.cc:712 mixer_strip.cc:838
+#: ardour_ui_ed.cc:195 global_port_matrix.cc:207 io_selector.cc:210
+#: mixer_strip.cc:718 mixer_strip.cc:844
 msgid "Disconnect"
 msgstr "Отсоединить"
 
@@ -1769,36 +1759,39 @@ msgstr "Редактор на полный экран"
 msgid "Show Toolbars"
 msgstr "Показывать панели"
 
-#: ardour_ui_ed.cc:230 mixer_ui.cc:1863 mixer_ui.cc:1869
+#: ardour_ui_ed.cc:230 mixer_ui.cc:1865 mixer_ui.cc:1871
 msgid "Window|Mixer"
 msgstr "Микшер"
 
 #: ardour_ui_ed.cc:231
-#, fuzzy
 msgid "Toggle Editor+Mixer"
 msgstr "Редактор или микшер на переднем плане"
 
-#: ardour_ui_ed.cc:233 midi_tracer.cc:39
+#: ardour_ui_ed.cc:232 meterbridge.cc:224 meterbridge.cc:230
+msgid "Window|Meterbridge"
+msgstr "Панель индикаторов"
+
+#: ardour_ui_ed.cc:234 midi_tracer.cc:39
 msgid "MIDI Tracer"
 msgstr "Журнал MIDI-событий"
 
-#: ardour_ui_ed.cc:235
+#: ardour_ui_ed.cc:236
 msgid "Chat"
 msgstr "Пообщаться"
 
-#: ardour_ui_ed.cc:237
+#: ardour_ui_ed.cc:238
 msgid "Help|Manual"
 msgstr "Справка"
 
-#: ardour_ui_ed.cc:238
+#: ardour_ui_ed.cc:239
 msgid "Reference"
 msgstr "Справка в Интернете"
 
-#: ardour_ui_ed.cc:240 plugin_ui.cc:419
+#: ardour_ui_ed.cc:241 plugin_ui.cc:418
 msgid "Save"
 msgstr "Сохранить"
 
-#: ardour_ui_ed.cc:248 rc_option_editor.cc:1114 rc_option_editor.cc:1125
+#: ardour_ui_ed.cc:249 rc_option_editor.cc:1114 rc_option_editor.cc:1125
 #: rc_option_editor.cc:1134 rc_option_editor.cc:1147 rc_option_editor.cc:1160
 #: rc_option_editor.cc:1169 rc_option_editor.cc:1179 rc_option_editor.cc:1181
 #: rc_option_editor.cc:1191 rc_option_editor.cc:1207 rc_option_editor.cc:1220
@@ -1808,99 +1801,99 @@ msgstr "Сохранить"
 msgid "Transport"
 msgstr "Транспорт"
 
-#: ardour_ui_ed.cc:254 engine_dialog.cc:85 sfdb_ui.cc:559
+#: ardour_ui_ed.cc:255 engine_dialog.cc:85
 msgid "Stop"
 msgstr "Стоп"
 
-#: ardour_ui_ed.cc:257
+#: ardour_ui_ed.cc:258
 msgid "Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:261
+#: ardour_ui_ed.cc:262
 msgid "Start/Stop"
 msgstr "Старт/Стоп"
 
-#: ardour_ui_ed.cc:264
+#: ardour_ui_ed.cc:265
 msgid "Start/Continue/Stop"
 msgstr "Старт/Продолжить/Стоп"
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:268
 msgid "Stop and Forget Capture"
 msgstr "Остановиться и забыть захват"
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:278
 msgid "Transition To Roll"
 msgstr "В обычном направлении"
 
-#: ardour_ui_ed.cc:281
+#: ardour_ui_ed.cc:282
 msgid "Transition To Reverse"
 msgstr "В обратном направлении"
 
-#: ardour_ui_ed.cc:285
+#: ardour_ui_ed.cc:286
 msgid "Play Loop Range"
 msgstr "Воспроизвести петлю"
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:289
 msgid "Play Selected Range"
 msgstr ""
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:292
 msgid "Play Selection w/Preroll"
 msgstr ""
 
-#: ardour_ui_ed.cc:295
+#: ardour_ui_ed.cc:296
 msgid "Enable Record"
 msgstr "Разрешить запись"
 
-#: ardour_ui_ed.cc:298
+#: ardour_ui_ed.cc:299
 msgid "Start Recording"
 msgstr "Начать запись"
 
-#: ardour_ui_ed.cc:302
+#: ardour_ui_ed.cc:303
 msgid "Rewind"
 msgstr "Перемотать назад"
 
-#: ardour_ui_ed.cc:305
+#: ardour_ui_ed.cc:306
 msgid "Rewind (Slow)"
 msgstr "Перемотать назад (медленно)"
 
-#: ardour_ui_ed.cc:308
+#: ardour_ui_ed.cc:309
 msgid "Rewind (Fast)"
 msgstr "Перемотать назад (быстро)"
 
-#: ardour_ui_ed.cc:311 startup.cc:727
+#: ardour_ui_ed.cc:312 startup.cc:727
 msgid "Forward"
 msgstr "Перемотать вперёд"
 
-#: ardour_ui_ed.cc:314
+#: ardour_ui_ed.cc:315
 msgid "Forward (Slow)"
 msgstr "Перемотать вперёд (медленно)"
 
-#: ardour_ui_ed.cc:317
+#: ardour_ui_ed.cc:318
 msgid "Forward (Fast)"
 msgstr "Перемотать вперёд (быстро)"
 
-#: ardour_ui_ed.cc:320
+#: ardour_ui_ed.cc:321
 msgid "Goto Zero"
 msgstr "К нулевой отметке"
 
-#: ardour_ui_ed.cc:323
+#: ardour_ui_ed.cc:324
 msgid "Goto Start"
 msgstr "К началу"
 
-#: ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:327
 msgid "Goto End"
 msgstr "В конец"
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:330
 msgid "Goto Wall Clock"
 msgstr "К  текущему времени"
 
-#: ardour_ui_ed.cc:333
+#: ardour_ui_ed.cc:334
 msgid "Focus On Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:337 ardour_ui_ed.cc:346 audio_clock.cc:2046 editor.cc:237
+#: ardour_ui_ed.cc:338 ardour_ui_ed.cc:347 audio_clock.cc:2046 editor.cc:237
 #: editor_actions.cc:544 editor_actions.cc:553 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
@@ -1909,125 +1902,125 @@ msgstr ""
 msgid "Timecode"
 msgstr "Тайм-код"
 
-#: ardour_ui_ed.cc:339 ardour_ui_ed.cc:348 editor_actions.cc:542
+#: ardour_ui_ed.cc:340 ardour_ui_ed.cc:349 editor_actions.cc:542
 msgid "Bars & Beats"
 msgstr "Такты и доли"
 
-#: ardour_ui_ed.cc:341 ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:342 ardour_ui_ed.cc:351
 msgid "Minutes & Seconds"
 msgstr "Минуты и секунды"
 
-#: ardour_ui_ed.cc:343 ardour_ui_ed.cc:352 audio_clock.cc:2050 editor.cc:238
+#: ardour_ui_ed.cc:344 ardour_ui_ed.cc:353 audio_clock.cc:2050 editor.cc:238
 #: editor_actions.cc:543
 msgid "Samples"
 msgstr "Сэмплы"
 
-#: ardour_ui_ed.cc:355
+#: ardour_ui_ed.cc:356
 msgid "Punch In"
 msgstr "Начало врезки"
 
-#: ardour_ui_ed.cc:356 mixer_strip.cc:1904 route_ui.cc:132
+#: ardour_ui_ed.cc:357 mixer_strip.cc:1904 route_ui.cc:132
 #: time_info_box.cc:113
 msgid "In"
 msgstr "Вход"
 
-#: ardour_ui_ed.cc:359
+#: ardour_ui_ed.cc:360
 msgid "Punch Out"
 msgstr "Конец врезки"
 
-#: ardour_ui_ed.cc:360 time_info_box.cc:114
+#: ardour_ui_ed.cc:361 time_info_box.cc:114
 msgid "Out"
 msgstr "Выход"
 
-#: ardour_ui_ed.cc:363
+#: ardour_ui_ed.cc:364
 msgid "Punch In/Out"
 msgstr "Врезка"
 
-#: ardour_ui_ed.cc:364
+#: ardour_ui_ed.cc:365
 msgid "In/Out"
 msgstr "Вх/Вых"
 
-#: ardour_ui_ed.cc:367 rc_option_editor.cc:1071
+#: ardour_ui_ed.cc:368 rc_option_editor.cc:1071
 msgid "Click"
 msgstr "Метроном"
 
-#: ardour_ui_ed.cc:370
+#: ardour_ui_ed.cc:371
 msgid "Auto Input"
 msgstr "Автовход"
 
-#: ardour_ui_ed.cc:373
+#: ardour_ui_ed.cc:374
 msgid "Auto Play"
 msgstr "Автовоспр."
 
-#: ardour_ui_ed.cc:384
+#: ardour_ui_ed.cc:385
 msgid "Sync Startup to Video"
 msgstr "Синхронизировать начало с видео"
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:387
 msgid "Time Master"
 msgstr "Ведущий времени"
 
-#: ardour_ui_ed.cc:393
+#: ardour_ui_ed.cc:394
 msgid "Toggle Record Enable Track %1"
 msgstr "Переключить записываемость дорожки %1"
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:401
 msgid "Percentage"
 msgstr "Проценты"
 
-#: ardour_ui_ed.cc:401 shuttle_control.cc:169
+#: ardour_ui_ed.cc:402 shuttle_control.cc:169
 msgid "Semitones"
 msgstr "Полутона"
 
-#: ardour_ui_ed.cc:405
+#: ardour_ui_ed.cc:406
 msgid "Send MTC"
 msgstr "Передавать MTC"
 
-#: ardour_ui_ed.cc:407
+#: ardour_ui_ed.cc:408
 msgid "Send MMC"
 msgstr "Передавать MMC"
 
-#: ardour_ui_ed.cc:409
+#: ardour_ui_ed.cc:410
 msgid "Use MMC"
 msgstr "Использовать MMC"
 
-#: ardour_ui_ed.cc:411 rc_option_editor.cc:1702
+#: ardour_ui_ed.cc:412 rc_option_editor.cc:1702
 msgid "Send MIDI Clock"
 msgstr "Отправлять MIDI Clock"
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:414
 msgid "Send MIDI Feedback"
 msgstr "Отправлять MIDI Feedback"
 
-#: ardour_ui_ed.cc:419
+#: ardour_ui_ed.cc:420
 msgid "Panic"
 msgstr ""
 
-#: ardour_ui_ed.cc:559
+#: ardour_ui_ed.cc:560
 msgid "Wall Clock"
 msgstr "Текущее время"
 
-#: ardour_ui_ed.cc:560
+#: ardour_ui_ed.cc:561
 msgid "Disk Space"
 msgstr "Диск. пространство"
 
-#: ardour_ui_ed.cc:561
+#: ardour_ui_ed.cc:562
 msgid "DSP"
 msgstr "DSP"
 
-#: ardour_ui_ed.cc:562
+#: ardour_ui_ed.cc:563
 msgid "Buffers"
 msgstr "Буферы"
 
-#: ardour_ui_ed.cc:563
+#: ardour_ui_ed.cc:564
 msgid "JACK Sampling Rate and Latency"
 msgstr "Частота сэмплирования и задержка JACK"
 
-#: ardour_ui_ed.cc:564
+#: ardour_ui_ed.cc:565
 msgid "Timecode Format"
 msgstr "Формат тайм-кода"
 
-#: ardour_ui_ed.cc:565
+#: ardour_ui_ed.cc:566
 msgid "File Format"
 msgstr "Формат файлов"
 
@@ -2075,7 +2068,7 @@ msgstr "Темп"
 msgid "Meter"
 msgstr "Размер"
 
-#: audio_clock.cc:1819 audio_streamview.cc:116 editor_actions.cc:1030
+#: audio_clock.cc:1819 audio_streamview.cc:116 editor_actions.cc:1039
 #: midi_region_view.cc:2991 session_metadata_dialog.cc:331
 #: session_metadata_dialog.cc:379 session_metadata_dialog.cc:435
 #: session_metadata_dialog.cc:716
@@ -2164,28 +2157,28 @@ msgid "hide track"
 msgstr "Скрыть дорожку"
 
 #: automation_time_axis.cc:255 automation_time_axis.cc:307
-#: automation_time_axis.cc:496 gain_meter.cc:196 generic_pluginui.cc:456
-#: generic_pluginui.cc:733 panner_ui.cc:150
+#: automation_time_axis.cc:496 gain_meter.cc:194 generic_pluginui.cc:456
+#: generic_pluginui.cc:746 panner_ui.cc:150
 msgid "Automation|Manual"
 msgstr "Вручную"
 
 #: automation_time_axis.cc:257 automation_time_axis.cc:318
 #: automation_time_axis.cc:501 editor.cc:1933 editor.cc:2010
-#: editor_actions.cc:118 editor_actions.cc:1856 gain_meter.cc:199
-#: generic_pluginui.cc:459 generic_pluginui.cc:735 midi_time_axis.cc:1488
+#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:197
+#: generic_pluginui.cc:459 generic_pluginui.cc:748 midi_time_axis.cc:1488
 #: midi_time_axis.cc:1491 midi_time_axis.cc:1494 panner_ui.cc:153
 msgid "Play"
-msgstr "Воспроизведение"
+msgstr "Воспр."
 
 #: automation_time_axis.cc:259 automation_time_axis.cc:329
-#: automation_time_axis.cc:506 gain_meter.cc:202 generic_pluginui.cc:462
-#: generic_pluginui.cc:737 panner_ui.cc:156
+#: automation_time_axis.cc:506 gain_meter.cc:200 generic_pluginui.cc:462
+#: generic_pluginui.cc:750 panner_ui.cc:156
 msgid "Write"
 msgstr "Запись"
 
 #: automation_time_axis.cc:261 automation_time_axis.cc:340
-#: automation_time_axis.cc:511 gain_meter.cc:205 generic_pluginui.cc:465
-#: generic_pluginui.cc:739 panner_ui.cc:159
+#: automation_time_axis.cc:511 gain_meter.cc:203 generic_pluginui.cc:465
+#: generic_pluginui.cc:752 panner_ui.cc:159
 msgid "Touch"
 msgstr "Касание"
 
@@ -2198,7 +2191,7 @@ msgid "clear automation"
 msgstr "Очистить автоматизацию"
 
 #: automation_time_axis.cc:485 editor_actions.cc:613 editor_markers.cc:857
-#: location_ui.cc:55 plugin_selector.cc:85 route_time_axis.cc:699
+#: location_ui.cc:55 plugin_selector.cc:85 route_time_axis.cc:708
 msgid "Hide"
 msgstr "Скрыть"
 
@@ -2219,7 +2212,7 @@ msgstr "Дискретный"
 msgid "Linear"
 msgstr "Линейная"
 
-#: automation_time_axis.cc:543 rhythm_ferret.cc:110 route_time_axis.cc:638
+#: automation_time_axis.cc:543 rhythm_ferret.cc:110 route_time_axis.cc:647
 #: shuttle_control.cc:188
 msgid "Mode"
 msgstr "Режим"
@@ -2236,13 +2229,13 @@ msgstr "Изменение пакета"
 msgid "Direction:"
 msgstr "Направление:"
 
-#: bundle_manager.cc:205 bundle_manager.cc:209 mixer_strip.cc:156
-#: mixer_strip.cc:2132
+#: bundle_manager.cc:205 bundle_manager.cc:209 mixer_strip.cc:157
+#: mixer_strip.cc:2126
 msgid "Input"
 msgstr "Вход"
 
 #: bundle_manager.cc:206 bundle_manager.cc:211 bundle_manager.cc:245
-#: mixer_strip.cc:161 mixer_strip.cc:2135
+#: mixer_strip.cc:162 mixer_strip.cc:2129
 msgid "Output"
 msgstr "Выход"
 
@@ -2252,8 +2245,8 @@ msgid "Edit"
 msgstr "Правка"
 
 #: bundle_manager.cc:265 editor.cc:5493 editor_actions.cc:310
-#: editor_actions.cc:368 plugin_ui.cc:420 processor_box.cc:2227
-#: route_time_axis.cc:704
+#: editor_actions.cc:368 plugin_ui.cc:419 processor_box.cc:2216
+#: route_time_axis.cc:713
 msgid "Delete"
 msgstr "Удалить"
 
@@ -2421,7 +2414,7 @@ msgstr "Время"
 
 #: edit_note_dialog.cc:98 editor_regions.cc:114
 #: export_timespan_selector.cc:359 export_timespan_selector.cc:421
-#: location_ui.cc:313 midi_list_editor.cc:114 time_info_box.cc:105
+#: location_ui.cc:317 midi_list_editor.cc:114 time_info_box.cc:105
 msgid "Length"
 msgstr "Длительность"
 
@@ -2640,7 +2633,7 @@ msgstr "Маркеры CD"
 
 #: editor.cc:245
 msgid "Video Timeline"
-msgstr ""
+msgstr "Видеолинейка"
 
 #: editor.cc:260
 msgid "mode"
@@ -2677,7 +2670,7 @@ msgid "Editor"
 msgstr "Редактор"
 
 #: editor.cc:1215 editor.cc:1225 editor.cc:4440 editor_actions.cc:130
-#: editor_actions.cc:1804
+#: editor_actions.cc:1813
 msgid "Loop"
 msgstr "Петля"
 
@@ -2702,8 +2695,8 @@ msgstr "Симметрично"
 msgid "Slow"
 msgstr "Медленно"
 
-#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1606
-#: sfdb_ui.cc:1715
+#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1633
+#: sfdb_ui.cc:1742
 msgid "Fast"
 msgstr "Быстро"
 
@@ -2723,7 +2716,7 @@ msgstr "Активировать"
 msgid "Slowest"
 msgstr "Медленнее всего"
 
-#: editor.cc:1572 route_time_axis.cc:1863 selection.cc:1009 selection.cc:1064
+#: editor.cc:1572 route_time_axis.cc:1877 selection.cc:1009 selection.cc:1064
 msgid "programming error: "
 msgstr "Ошибка в программе: "
 
@@ -2840,7 +2833,7 @@ msgid "Select All in Track"
 msgstr "Выделить всё на дорожке"
 
 #: editor.cc:1942 editor.cc:2019 editor_actions.cc:185
-#: export_timespan_selector.cc:53 processor_box.cc:2235
+#: export_timespan_selector.cc:53 processor_box.cc:2224
 msgid "Select All"
 msgstr "Выделить всё"
 
@@ -2892,15 +2885,15 @@ msgstr "Создать выделение между указателем и к
 msgid "Select"
 msgstr "Выделить"
 
-#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2220
+#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2209
 msgid "Cut"
 msgstr "Вырезать"
 
-#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2223
+#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2212
 msgid "Copy"
 msgstr "Копировать"
 
-#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2231
+#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2220
 msgid "Paste"
 msgstr "Вставить"
 
@@ -3054,7 +3047,7 @@ msgstr "Вернуть"
 msgid "Redo (%1)"
 msgstr "Вернуть (%1)"
 
-#: editor.cc:3286 editor.cc:3310 editor_actions.cc:106 editor_actions.cc:1785
+#: editor.cc:3286 editor.cc:3310 editor_actions.cc:106 editor_actions.cc:1794
 msgid "Duplicate"
 msgstr "Продублировать"
 
@@ -3105,7 +3098,7 @@ msgstr "Очистить списки воспроизведения"
 msgid "Please wait while %1 loads visual data."
 msgstr "Дождитесь загрузки визуальных данных в %1."
 
-#: editor.cc:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2251
+#: editor.cc:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2240
 msgid "Edit..."
 msgstr "Изменить"
 
@@ -3154,7 +3147,7 @@ msgstr "Слои"
 msgid "Position"
 msgstr "Положение"
 
-#: editor_actions.cc:101 gain_meter.cc:124 gain_meter.cc:755 panner_ui.cc:177
+#: editor_actions.cc:101 gain_meter.cc:120 gain_meter.cc:787 panner_ui.cc:177
 #: panner_ui.cc:586
 msgid "Trim"
 msgstr "Обрезать"
@@ -3167,7 +3160,7 @@ msgstr "Усиление"
 msgid "Ranges"
 msgstr "Выделения"
 
-#: editor_actions.cc:104 editor_actions.cc:1781 session_option_editor.cc:145
+#: editor_actions.cc:104 editor_actions.cc:1790 session_option_editor.cc:145
 #: session_option_editor.cc:147 session_option_editor.cc:156
 #: session_option_editor.cc:163
 msgid "Fades"
@@ -3246,8 +3239,8 @@ msgstr "Дополнительный счётчик"
 msgid "Separate"
 msgstr "Разделить"
 
-#: editor_actions.cc:132 mixer_strip.cc:1916 route_time_axis.cc:199
-#: route_time_axis.cc:2397
+#: editor_actions.cc:132 mixer_strip.cc:1913 route_time_axis.cc:208
+#: route_time_axis.cc:2417
 msgid "Solo"
 msgstr "Соло"
 
@@ -3259,7 +3252,7 @@ msgstr "Подвыборки"
 msgid "Timecode fps"
 msgstr "Скорость (FPS) тайм-кода"
 
-#: editor_actions.cc:137 route_time_axis.cc:421
+#: editor_actions.cc:137 route_time_axis.cc:430
 msgid "Height"
 msgstr "Высота"
 
@@ -3383,7 +3376,7 @@ msgstr "К началу области"
 msgid "Playhead to Range End"
 msgstr "К концу области"
 
-#: editor_actions.cc:186 export_timespan_selector.cc:61 processor_box.cc:2237
+#: editor_actions.cc:186 export_timespan_selector.cc:61 processor_box.cc:2226
 msgid "Deselect All"
 msgstr "Снять все выделения"
 
@@ -3651,9 +3644,9 @@ msgstr "Вставить промежуток времени"
 msgid "Toggle Active"
 msgstr "Переключить активность"
 
-#: editor_actions.cc:370 editor_actions.cc:1707 editor_markers.cc:876
-#: editor_markers.cc:941 editor_snapshots.cc:121 mixer_strip.cc:1488
-#: route_time_axis.cc:701
+#: editor_actions.cc:370 editor_actions.cc:1716 editor_markers.cc:876
+#: editor_markers.cc:941 editor_snapshots.cc:121 mixer_strip.cc:1494
+#: route_time_axis.cc:710
 msgid "Remove"
 msgstr "Удалить"
 
@@ -3661,19 +3654,19 @@ msgstr "Удалить"
 msgid "Fit Selected Tracks"
 msgstr "Только выделенные дорожки"
 
-#: editor_actions.cc:376 time_axis_view.cc:1298
+#: editor_actions.cc:376 time_axis_view.cc:1301
 msgid "Largest"
 msgstr "Огромная"
 
-#: editor_actions.cc:379 time_axis_view.cc:1299
+#: editor_actions.cc:379 time_axis_view.cc:1302
 msgid "Larger"
 msgstr "Больше"
 
-#: editor_actions.cc:382 editor_rulers.cc:375 time_axis_view.cc:1300
+#: editor_actions.cc:382 editor_rulers.cc:375 time_axis_view.cc:1303
 msgid "Large"
 msgstr "Большая"
 
-#: editor_actions.cc:388 editor_rulers.cc:379 time_axis_view.cc:1302
+#: editor_actions.cc:388 editor_rulers.cc:379 time_axis_view.cc:1305
 msgid "Small"
 msgstr "Маленькая"
 
@@ -3769,7 +3762,7 @@ msgstr "Стыковка"
 msgid "Slide"
 msgstr "Скольжение"
 
-#: editor_actions.cc:478 editor_actions.cc:1728 editor_markers.cc:860
+#: editor_actions.cc:478 editor_actions.cc:1737 editor_markers.cc:860
 #: editor_rulers.cc:386 location_ui.cc:56
 msgid "Lock"
 msgstr "Блок"
@@ -3939,43 +3932,36 @@ msgid "Min:Sec"
 msgstr "Мин:С"
 
 #: editor_actions.cc:547 editor_actions.cc:550
-#, fuzzy
 msgid "Video Monitor"
-msgstr "Монитор"
+msgstr "Видеомонитор"
 
 #: editor_actions.cc:549 rc_option_editor.cc:1834
 msgid "Video"
-msgstr ""
+msgstr "Видео"
 
 #: editor_actions.cc:552
-#, fuzzy
 msgid "Always on Top"
-msgstr "На самый верх"
+msgstr "Всегда сверху"
 
 #: editor_actions.cc:554
-#, fuzzy
-msgid "Framenumber"
-msgstr "Номер дорожки"
+msgid "Frame number"
+msgstr "Номер кадра"
 
 #: editor_actions.cc:555
-#, fuzzy
 msgid "Timecode Background"
-msgstr "FPS синхросигнала"
+msgstr "Фон тайм-кода"
 
 #: editor_actions.cc:556
-#, fuzzy
 msgid "Fullscreen"
-msgstr "Полная тишина"
+msgstr "Во весь экран"
 
 #: editor_actions.cc:557
-#, fuzzy
 msgid "Letterbox"
-msgstr "Нормальное"
+msgstr "Уместить в окно"
 
 #: editor_actions.cc:558
-#, fuzzy
 msgid "Original Size"
-msgstr "Исходное положение"
+msgstr "Исходный размер"
 
 #: editor_actions.cc:608
 msgid "Sort"
@@ -4047,7 +4033,7 @@ msgstr ""
 
 #: editor_actions.cc:652 editor_audio_import.cc:279
 #: session_import_dialog.cc:74 session_import_dialog.cc:94
-#: session_metadata_dialog.cc:297 editor_videotimeline.cc:107
+#: session_metadata_dialog.cc:297 editor_videotimeline.cc:108
 msgid "Import"
 msgstr "Импортировать"
 
@@ -4087,289 +4073,289 @@ msgstr ""
 msgid "Could not find editor.bindings in search path %1"
 msgstr ""
 
-#: editor_actions.cc:1019 editor_actions.cc:1415 editor_actions.cc:1426
-#: editor_actions.cc:1479 editor_actions.cc:1490 editor_actions.cc:1537
-#: editor_actions.cc:1547 editor_regions.cc:1561
+#: editor_actions.cc:1028 editor_actions.cc:1424 editor_actions.cc:1435
+#: editor_actions.cc:1488 editor_actions.cc:1499 editor_actions.cc:1546
+#: editor_actions.cc:1556 editor_regions.cc:1561
 msgid "programming error: %1: %2"
 msgstr "Ошибка в программе: %1: %2"
 
-#: editor_actions.cc:1713
+#: editor_actions.cc:1722
 msgid "Raise"
 msgstr "Поднять"
 
-#: editor_actions.cc:1716
+#: editor_actions.cc:1725
 msgid "Raise to Top"
 msgstr "На самый верх"
 
-#: editor_actions.cc:1719 gtk-custom-ruler.c:132
+#: editor_actions.cc:1728 gtk-custom-ruler.c:132
 msgid "Lower"
 msgstr "Опустить"
 
-#: editor_actions.cc:1722
+#: editor_actions.cc:1731
 msgid "Lower to Bottom"
 msgstr "В самый низ"
 
-#: editor_actions.cc:1725
+#: editor_actions.cc:1734
 msgid "Move to Original Position"
 msgstr "К исходной позиции"
 
-#: editor_actions.cc:1730
+#: editor_actions.cc:1739
 msgid "Lock to Video"
 msgstr ""
 
-#: editor_actions.cc:1735 editor_markers.cc:867
+#: editor_actions.cc:1744 editor_markers.cc:867
 msgid "Glue to Bars and Beats"
 msgstr "Приклеить к тактам и долям"
 
-#: editor_actions.cc:1740
+#: editor_actions.cc:1749
 msgid "Remove Sync"
 msgstr "Удалить синхронизатор"
 
-#: editor_actions.cc:1743 mixer_strip.cc:1903 route_time_axis.cc:200
+#: editor_actions.cc:1752 mixer_strip.cc:1903 route_time_axis.cc:209
 msgid "Mute"
 msgstr "Молча"
 
-#: editor_actions.cc:1746
+#: editor_actions.cc:1755
 msgid "Normalize..."
 msgstr "Нормировать сигнал..."
 
-#: editor_actions.cc:1749
+#: editor_actions.cc:1758
 msgid "Reverse"
 msgstr "Развернуть"
 
-#: editor_actions.cc:1752
+#: editor_actions.cc:1761
 msgid "Make Mono Regions"
 msgstr "Создать моно-области"
 
-#: editor_actions.cc:1755
+#: editor_actions.cc:1764
 msgid "Boost Gain"
 msgstr "Повысить громкость области"
 
-#: editor_actions.cc:1758
+#: editor_actions.cc:1767
 msgid "Cut Gain"
 msgstr "Понизить громкость области"
 
-#: editor_actions.cc:1761
+#: editor_actions.cc:1770
 msgid "Pitch Shift..."
 msgstr "Смена высоты тона…"
 
-#: editor_actions.cc:1764
+#: editor_actions.cc:1773
 msgid "Transpose..."
 msgstr "Транспозиция…"
 
-#: editor_actions.cc:1767
+#: editor_actions.cc:1776
 msgid "Opaque"
 msgstr "Непрозрачно"
 
-#: editor_actions.cc:1771 editor_regions.cc:116
+#: editor_actions.cc:1780 editor_regions.cc:116
 msgid "Fade In"
 msgstr "Нарастание"
 
-#: editor_actions.cc:1776 editor_regions.cc:117
+#: editor_actions.cc:1785 editor_regions.cc:117
 msgid "Fade Out"
 msgstr "Затухание"
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1800
 msgid "Multi-Duplicate..."
 msgstr "Продублировать многократно..."
 
-#: editor_actions.cc:1796
+#: editor_actions.cc:1805
 msgid "Fill Track"
 msgstr "Заполнить дорожку"
 
-#: editor_actions.cc:1800 editor_markers.cc:955
+#: editor_actions.cc:1809 editor_markers.cc:955
 msgid "Set Loop Range"
 msgstr "Установить область петли"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1816
 msgid "Set Punch"
 msgstr "Установить врезку"
 
-#: editor_actions.cc:1811
+#: editor_actions.cc:1820
 msgid "Add Single Range Marker"
 msgstr "Добавить маркер текущей области"
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1825
 msgid "Add Range Marker Per Region"
 msgstr "Добавить по маркеру на каждую область"
 
-#: editor_actions.cc:1820
+#: editor_actions.cc:1829
 msgid "Snap Position To Grid"
 msgstr ""
 
-#: editor_actions.cc:1823
+#: editor_actions.cc:1832
 msgid "Close Gaps"
 msgstr "Закрыть интервалы"
 
-#: editor_actions.cc:1826
+#: editor_actions.cc:1835
 msgid "Rhythm Ferret..."
 msgstr "Ритмический хорёк..."
 
-#: editor_actions.cc:1829
+#: editor_actions.cc:1838
 msgid "Export..."
 msgstr "Экспортировать..."
 
-#: editor_actions.cc:1835
+#: editor_actions.cc:1844
 msgid "Separate Under"
 msgstr "Разделить под"
 
-#: editor_actions.cc:1839
+#: editor_actions.cc:1848
 msgid "Set Fade In Length"
 msgstr "Установить длину фейда нарастания"
 
-#: editor_actions.cc:1840
+#: editor_actions.cc:1849
 msgid "Set Fade Out Length"
 msgstr "Установить длину фейда затухания"
 
-#: editor_actions.cc:1841
+#: editor_actions.cc:1850
 msgid "Set Tempo from Region = Bar"
 msgstr "Установить темп, считая что область = такт"
 
-#: editor_actions.cc:1846
+#: editor_actions.cc:1855
 msgid "Split at Percussion Onsets"
 msgstr "Разделить по атакам перкуссии"
 
-#: editor_actions.cc:1851
+#: editor_actions.cc:1860
 msgid "List Editor..."
 msgstr "Редактор списка событий"
 
-#: editor_actions.cc:1854
+#: editor_actions.cc:1863
 msgid "Properties..."
 msgstr "Свойства..."
 
-#: editor_actions.cc:1858
+#: editor_actions.cc:1867
 msgid "Bounce (with processing)"
 msgstr "Свести (с обработкой)"
 
-#: editor_actions.cc:1859
+#: editor_actions.cc:1868
 msgid "Bounce (without processing)"
 msgstr "Свести (без обработки)"
 
-#: editor_actions.cc:1860
+#: editor_actions.cc:1869
 msgid "Combine"
 msgstr "Объединить"
 
-#: editor_actions.cc:1861
+#: editor_actions.cc:1870
 msgid "Uncombine"
 msgstr "Снять объединение"
 
-#: editor_actions.cc:1863
+#: editor_actions.cc:1872
 msgid "Spectral Analysis..."
 msgstr "Спектральный анализ..."
 
-#: editor_actions.cc:1865
+#: editor_actions.cc:1874
 msgid "Reset Envelope"
 msgstr "Сбросить огибающую"
 
-#: editor_actions.cc:1867
+#: editor_actions.cc:1876
 msgid "Reset Gain"
 msgstr "Сбросить усиление"
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1881
 msgid "Envelope Active"
 msgstr "Огибающая активна"
 
-#: editor_actions.cc:1876
+#: editor_actions.cc:1885
 msgid "Quantize..."
 msgstr "Квантование..."
 
-#: editor_actions.cc:1877 editor_actions.cc:1878
+#: editor_actions.cc:1886 editor_actions.cc:1887
 msgid "Insert Patch Change..."
 msgstr "Вставить смену программы..."
 
-#: editor_actions.cc:1879
+#: editor_actions.cc:1888
 msgid "Unlink from other copies"
 msgstr ""
 
-#: editor_actions.cc:1880
+#: editor_actions.cc:1889
 msgid "Strip Silence..."
 msgstr "Вырезать тишину..."
 
-#: editor_actions.cc:1881
+#: editor_actions.cc:1890
 msgid "Set Range Selection"
 msgstr "Создать выделение из области"
 
-#: editor_actions.cc:1883
+#: editor_actions.cc:1892
 msgid "Nudge Later"
 msgstr "Толкнуть вперёд"
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1893
 msgid "Nudge Earlier"
 msgstr "Толкнуть назад"
 
-#: editor_actions.cc:1889
+#: editor_actions.cc:1898
 msgid "Nudge Later by Capture Offset"
 msgstr "Толкнуть вперёд на смещение захвата"
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1905
 msgid "Nudge Earlier by Capture Offset"
 msgstr "Толкнуть назад на смещение захвата"
 
-#: editor_actions.cc:1900
+#: editor_actions.cc:1909
 msgid "Trim to Loop"
 msgstr "В петлю"
 
-#: editor_actions.cc:1901
+#: editor_actions.cc:1910
 msgid "Trim to Punch"
 msgstr "Во врезку"
 
-#: editor_actions.cc:1903
+#: editor_actions.cc:1912
 msgid "Trim to Previous"
 msgstr "До предыдущей области"
 
-#: editor_actions.cc:1904
+#: editor_actions.cc:1913
 msgid "Trim to Next"
 msgstr "До следующей области"
 
-#: editor_actions.cc:1911
+#: editor_actions.cc:1920
 msgid "Insert Region From Region List"
 msgstr "Вставить область из списка областей"
 
-#: editor_actions.cc:1917
+#: editor_actions.cc:1926
 msgid "Set Sync Position"
 msgstr "Установить синхронизатор области"
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1927
 msgid "Place Transient"
 msgstr ""
 
-#: editor_actions.cc:1919
+#: editor_actions.cc:1928
 msgid "Split"
 msgstr "Разделить"
 
-#: editor_actions.cc:1920
+#: editor_actions.cc:1929
 msgid "Trim Start at Edit Point"
 msgstr "Начало по курсору редактора"
 
-#: editor_actions.cc:1921
+#: editor_actions.cc:1930
 msgid "Trim End at Edit Point"
 msgstr "Конец по курсору редактора"
 
-#: editor_actions.cc:1926
+#: editor_actions.cc:1935
 msgid "Align Start"
 msgstr "Выровнять начала областей"
 
-#: editor_actions.cc:1933
+#: editor_actions.cc:1942
 msgid "Align Start Relative"
 msgstr "Выровнять относительно начал областей"
 
-#: editor_actions.cc:1937
+#: editor_actions.cc:1946
 msgid "Align End"
 msgstr "Выровнять концы областей"
 
-#: editor_actions.cc:1942
+#: editor_actions.cc:1951
 msgid "Align End Relative"
 msgstr "Выровнять относительно концов областей"
 
-#: editor_actions.cc:1949
+#: editor_actions.cc:1958
 msgid "Align Sync"
 msgstr "Выровнять по синхронизаторам областей"
 
-#: editor_actions.cc:1956
+#: editor_actions.cc:1965
 msgid "Align Sync Relative"
 msgstr "Выровнять относительно синхронизаторов областей"
 
-#: editor_actions.cc:1960 editor_actions.cc:1963
+#: editor_actions.cc:1969 editor_actions.cc:1972
 msgid "Choose Top..."
 msgstr "Выбрать верхнюю область..."
 
@@ -4398,7 +4384,7 @@ msgstr ""
 "В этом сеансе уже есть исходный файл с именем %1. Вы хотите импортировать %2 "
 "как новый источник или пропустить его?"
 
-#: editor_audio_import.cc:279 editor_videotimeline.cc:107
+#: editor_audio_import.cc:279 editor_videotimeline.cc:108
 msgid "Cancel Import"
 msgstr "Отменить импорт"
 
@@ -4441,13 +4427,12 @@ msgid "fixed time region drag"
 msgstr ""
 
 #: editor_drag.cc:1700
-#, fuzzy
 msgid "Video Start:"
-msgstr "Mike Start"
+msgstr "Начало видеофайла"
 
 #: editor_drag.cc:1702
 msgid "Diff:"
-msgstr ""
+msgstr "Разница:"
 
 #: editor_drag.cc:1722
 msgid "Move Video"
@@ -4633,7 +4618,7 @@ msgid "end"
 msgstr "Конец"
 
 #: editor_markers.cc:646 editor_ops.cc:1744 editor_ops.cc:1764
-#: editor_ops.cc:1788 editor_ops.cc:1815 location_ui.cc:1005
+#: editor_ops.cc:1788 editor_ops.cc:1815 location_ui.cc:1017
 msgid "add marker"
 msgstr "добавка маркера"
 
@@ -4641,7 +4626,7 @@ msgstr "добавка маркера"
 msgid "range"
 msgstr "область"
 
-#: editor_markers.cc:713 location_ui.cc:840
+#: editor_markers.cc:713 location_ui.cc:852
 msgid "remove marker"
 msgstr "удаление маркера"
 
@@ -4718,7 +4703,7 @@ msgid "Rename Range"
 msgstr "Переименовать выделение"
 
 #: editor_markers.cc:1363 editor_mouse.cc:2510 processor_box.cc:1768
-#: processor_box.cc:2233 route_time_axis.cc:968 route_ui.cc:1535
+#: processor_box.cc:2222 route_time_axis.cc:982 route_ui.cc:1535
 msgid "Rename"
 msgstr "Переименовать"
 
@@ -5058,9 +5043,8 @@ msgid "toggle region lock"
 msgstr "переключение блокировки области"
 
 #: editor_ops.cc:5067
-#, fuzzy
 msgid "Toggle Video Lock"
-msgstr "переключение блокировки области"
+msgstr ""
 
 #: editor_ops.cc:5091
 msgid "region lock style"
@@ -5350,7 +5334,7 @@ msgstr ""
 msgid "Length of region fade-out (units: secondary clock), () if dsisabled"
 msgstr ""
 
-#: editor_regions.cc:118 mixer_strip.cc:1960 mono_panner.cc:179
+#: editor_regions.cc:118 mixer_strip.cc:1953 mono_panner.cc:179
 #: stereo_panner.cc:217 stereo_panner.cc:240
 msgid "L"
 msgstr "Л"
@@ -5367,8 +5351,9 @@ msgstr ""
 msgid "Region position glued to Bars|Beats time?"
 msgstr ""
 
-#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:723
-#: mixer_strip.cc:1934 panner_ui.cc:554 stereo_panner.cc:237
+#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:755
+#: mixer_strip.cc:1930 meter_strip.cc:272 panner_ui.cc:554
+#: stereo_panner.cc:237
 msgid "M"
 msgstr "В"
 
@@ -5437,7 +5422,8 @@ msgstr "Название дорожи/шины"
 msgid "Track/Bus visible ?"
 msgstr "Дорожка или шина видима?"
 
-#: editor_routes.cc:204 mixer_strip.cc:1951 route_time_axis.cc:2387
+#: editor_routes.cc:204 mixer_strip.cc:1944 meter_strip.cc:286
+#: route_time_axis.cc:2407
 msgid "A"
 msgstr "A"
 
@@ -5445,7 +5431,7 @@ msgstr "A"
 msgid "Track/Bus active ?"
 msgstr "Дорожка или шина активна?"
 
-#: editor_routes.cc:205 mixer_strip.cc:1935
+#: editor_routes.cc:205 mixer_strip.cc:1931
 msgid "I"
 msgstr "ВХ"
 
@@ -5453,7 +5439,7 @@ msgstr "ВХ"
 msgid "MIDI input enabled"
 msgstr "Вход MIDI включен"
 
-#: editor_routes.cc:206 mixer_strip.cc:1933 mono_panner.cc:198
+#: editor_routes.cc:206 mixer_strip.cc:1929 mono_panner.cc:198
 #: stereo_panner.cc:215 stereo_panner.cc:242
 msgid "R"
 msgstr "П"
@@ -5466,7 +5452,7 @@ msgstr "Готовность к записи"
 msgid "Muted"
 msgstr ""
 
-#: editor_routes.cc:208 mixer_strip.cc:1947
+#: editor_routes.cc:208 mixer_strip.cc:1940 meter_strip.cc:282
 msgid "S"
 msgstr "S"
 
@@ -5478,7 +5464,7 @@ msgstr "..."
 msgid "SI"
 msgstr ""
 
-#: editor_routes.cc:209 mixer_strip.cc:351 rc_option_editor.cc:1872
+#: editor_routes.cc:209 mixer_strip.cc:352 rc_option_editor.cc:1872
 msgid "Solo Isolated"
 msgstr "Изолирование соло"
 
@@ -5555,14 +5541,12 @@ msgid "New Meter"
 msgstr "Вставить новый размер"
 
 #: editor_rulers.cc:373
-#, fuzzy
 msgid "Timeline height"
-msgstr "Высота"
+msgstr "Высота видеолинейки"
 
 #: editor_rulers.cc:383
-#, fuzzy
 msgid "Align Video Track"
-msgstr "Добавить звуковую дорожку"
+msgstr "Выровнять видеодорожку"
 
 #: editor_selection.cc:889 editor_selection.cc:932
 msgid "set selected regions"
@@ -5762,7 +5746,7 @@ msgstr "192КГц"
 #: engine_dialog.cc:127 engine_dialog.cc:132 engine_dialog.cc:169
 #: engine_dialog.cc:552 midi_channel_selector.cc:163
 #: midi_channel_selector.cc:402 midi_channel_selector.cc:438
-#: rc_option_editor.cc:1250 sfdb_ui.cc:542
+#: rc_option_editor.cc:1250 sfdb_ui.cc:541
 msgid "None"
 msgstr "Нет"
 
@@ -5811,7 +5795,7 @@ msgstr "Драйвер:"
 msgid "Audio Interface:"
 msgstr "Звуковой интерфейс:"
 
-#: engine_dialog.cc:187 sfdb_ui.cc:148 sfdb_ui.cc:261 sfdb_ui.cc:266
+#: engine_dialog.cc:187 sfdb_ui.cc:149 sfdb_ui.cc:262 sfdb_ui.cc:267
 msgid "Sample rate:"
 msgstr "Частота сэмплирования:"
 
@@ -5933,7 +5917,7 @@ msgstr "Значению AudioSetup для %1 не хватает данных"
 msgid "configuration files contain a JACK server path that doesn't exist (%1)"
 msgstr ""
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:146
+#: export_channel_selector.cc:45 sfdb_ui.cc:147
 msgid "Channels:"
 msgstr "Каналов:"
 
@@ -5958,14 +5942,12 @@ msgid "Track output (channels: %1)"
 msgstr "Выход дорожки (каналов: %1)"
 
 #: export_channel_selector.cc:536
-#, fuzzy
 msgid "Export region contents"
-msgstr "Экспортировать область"
+msgstr "Экспортировать содержимое области"
 
 #: export_channel_selector.cc:537
-#, fuzzy
 msgid "Export track output"
-msgstr "Соединять выходы дорожек и шин"
+msgstr "Экспортировать выходы дорожки"
 
 #: export_dialog.cc:46
 msgid ""
@@ -6212,6 +6194,10 @@ msgstr "Параметры FLAC"
 msgid "Broadcast Wave options"
 msgstr "Параметры Broadcast Wave"
 
+#: export_format_selector.cc:136
+msgid "Do you really want to remove the format?"
+msgstr "Вы действительно хотите удалить этот формат?"
+
 #: export_preset_selector.cc:28
 msgid "Preset"
 msgstr "Профиль"
@@ -6222,6 +6208,10 @@ msgid ""
 "Perhaps it references a format that has been removed?"
 msgstr ""
 
+#: 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 "Показать время как:"
@@ -6234,36 +6224,32 @@ msgstr " до "
 msgid "Range"
 msgstr "Диапазон"
 
-#: gain_meter.cc:109 gain_meter.cc:431 gain_meter.cc:820
+#: gain_meter.cc:105 gain_meter.cc:356 gain_meter.cc:461 gain_meter.cc:852
 msgid "-inf"
 msgstr "-inf"
 
-#: gain_meter.cc:115 gain_meter.cc:869
+#: gain_meter.cc:111 gain_meter.cc:909
 msgid "Fader automation mode"
 msgstr "Режим автоматизации фейдера"
 
-#: gain_meter.cc:116 gain_meter.cc:870
+#: gain_meter.cc:112 gain_meter.cc:910
 msgid "Fader automation type"
 msgstr "Тип автоматизации фейдера"
 
-#: gain_meter.cc:125 gain_meter.cc:759 panner_ui.cc:178 panner_ui.cc:590
+#: gain_meter.cc:121 gain_meter.cc:791 panner_ui.cc:178 panner_ui.cc:590
 msgid "Abs"
 msgstr "Абс"
 
-#: gain_meter.cc:334
-msgid "-Inf"
-msgstr "-Inf"
-
-#: gain_meter.cc:726 mixer_strip.cc:1954 panner_ui.cc:557
-#: route_time_axis.cc:2391
+#: gain_meter.cc:758 mixer_strip.cc:1947 meter_strip.cc:289 panner_ui.cc:557
+#: route_time_axis.cc:2411
 msgid "P"
 msgstr "P"
 
-#: gain_meter.cc:729 panner_ui.cc:560
+#: gain_meter.cc:761 panner_ui.cc:560
 msgid "T"
 msgstr "К"
 
-#: gain_meter.cc:732 panner_ui.cc:563
+#: gain_meter.cc:764 panner_ui.cc:563
 msgid "W"
 msgstr "З"
 
@@ -6275,7 +6261,7 @@ msgstr "<span size=\"large\">Профили</span>"
 msgid "Switches"
 msgstr "Переключатели"
 
-#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2210
+#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2199
 msgid "Controls"
 msgstr "Управление"
 
@@ -6303,7 +6289,7 @@ msgstr "Управление звуковыми соединениями"
 msgid "MIDI Connection Manager"
 msgstr "Управление MIDI-соединениями"
 
-#: global_port_matrix.cc:204 io_selector.cc:216
+#: global_port_matrix.cc:213 io_selector.cc:216
 msgid "port"
 msgstr "порт"
 
@@ -6455,11 +6441,11 @@ msgstr "Импортируется  файл: %1 из %2"
 msgid "I/O selector"
 msgstr "Выбор входов и выходов"
 
-#: io_selector.cc:266
+#: io_selector.cc:265
 msgid "%1 input"
 msgstr "%1 вход"
 
-#: io_selector.cc:268
+#: io_selector.cc:267
 msgid "%1 output"
 msgstr "%1 выход"
 
@@ -6535,7 +6521,7 @@ msgstr[2] "%1 сэмплов"
 msgid "Reset"
 msgstr "Сбросить"
 
-#: latency_gui.cc:151 rhythm_ferret.cc:274 sfdb_ui.cc:1734
+#: latency_gui.cc:151 rhythm_ferret.cc:274 sfdb_ui.cc:1761
 msgid "programming error: %1 (%2)"
 msgstr "Ошибка в программе: %1 (%2)"
 
@@ -6563,63 +6549,63 @@ msgstr "Композитор:"
 msgid "Pre-Emphasis"
 msgstr ""
 
-#: location_ui.cc:310
+#: location_ui.cc:314
 msgid "Remove this range"
 msgstr "Удалить эту область"
 
-#: location_ui.cc:311
+#: location_ui.cc:315
 msgid "Start time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:312
+#: location_ui.cc:316
 msgid "End time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:315
+#: location_ui.cc:319
 msgid "Set range start from playhead location"
 msgstr "Установить начало диапазона по указателю воспроизведения"
 
-#: location_ui.cc:316
+#: location_ui.cc:320
 msgid "Set range end from playhead location"
 msgstr "Установить конец диапазона по указателю воспроизведения"
 
-#: location_ui.cc:320
+#: location_ui.cc:324
 msgid "Remove this marker"
 msgstr "Удалить этот маркер"
 
-#: location_ui.cc:321
+#: location_ui.cc:325
 msgid "Position - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:323
+#: location_ui.cc:327
 msgid "Set marker time from playhead location"
 msgstr ""
 
-#: location_ui.cc:462
+#: location_ui.cc:494
 msgid "You cannot put a CD marker at the start of the session"
 msgstr "Размещение маркера CD в начале сеанса невозможно"
 
-#: location_ui.cc:708
+#: location_ui.cc:720
 msgid "New Marker"
 msgstr "Создать маркер"
 
-#: location_ui.cc:709
+#: location_ui.cc:721
 msgid "New Range"
 msgstr "Создать область"
 
-#: location_ui.cc:722
+#: location_ui.cc:734
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "<b>Диапазоны петель/врезок</b>"
 
-#: location_ui.cc:747
+#: location_ui.cc:759
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>Маркеры (включая индекс CD)</b>"
 
-#: location_ui.cc:782
+#: location_ui.cc:794
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>Диапазоны (включая диапазоны дорожек CD)</b>"
 
-#: location_ui.cc:1024
+#: location_ui.cc:1036
 msgid "add range marker"
 msgstr "добавка маркера выделения"
 
@@ -6759,47 +6745,40 @@ msgid "Force"
 msgstr "Принуд."
 
 #: midi_channel_selector.cc:330 midi_channel_selector.cc:372
-#, fuzzy
 msgid "MIDI Channel Control"
-msgstr "Управление по MIDI"
+msgstr "Управление каналами MIDI"
 
 #: midi_channel_selector.cc:332
-#, fuzzy
 msgid "Playback all channels"
-msgstr "Скрыть все каналы"
+msgstr "Воспроизводить все каналы"
 
 #: midi_channel_selector.cc:333
-#, fuzzy
 msgid "Play only selected channels"
-msgstr "Воспроизвести выбранные области"
+msgstr "Воспроизводить только выбранные каналы"
 
 #: midi_channel_selector.cc:334
 msgid "Use a single fixed channel for all playback"
-msgstr ""
+msgstr "Использовать один канал для воспроизведения"
 
 #: midi_channel_selector.cc:335
-#, fuzzy
 msgid "Record all channels"
-msgstr "Скрыть все каналы"
+msgstr "Записывать все каналы"
 
 #: midi_channel_selector.cc:336
 msgid "Record only selected channels"
-msgstr ""
+msgstr "Записывать только выбранные каналы"
 
 #: midi_channel_selector.cc:337
-#, fuzzy
 msgid "Force all channels to 1 channel"
-msgstr "смена канала ноты"
+msgstr ""
 
 #: midi_channel_selector.cc:378
-#, fuzzy
 msgid "Inbound"
-msgstr "Границы областей"
+msgstr "Входящие события"
 
 #: midi_channel_selector.cc:398
-#, fuzzy
 msgid "Click to enable recording all channels"
-msgstr "Щелкните, чтобы включить или отключить этот модуль"
+msgstr "Щёлкните, чтобы включить запись во все каналы"
 
 #: midi_channel_selector.cc:403
 msgid "Click to disable recording all channels"
@@ -6810,9 +6789,8 @@ msgid "Click to invert currently selected recording channels"
 msgstr ""
 
 #: midi_channel_selector.cc:415
-#, fuzzy
 msgid "Playback"
-msgstr "Только воспроизведение"
+msgstr "Воспроизведение"
 
 #: midi_channel_selector.cc:434
 msgid "Click to enable playback of all channels"
@@ -7048,12 +7026,11 @@ msgstr "Режим внешнего устройства"
 
 #: midi_time_axis.cc:271
 msgid "Chns"
-msgstr ""
+msgstr "Кнл"
 
 #: midi_time_axis.cc:272
-#, fuzzy
 msgid "Click to edit channel settings"
-msgstr "Щёлкните для добавления нового расположения"
+msgstr "Щёлкните для изменения параметров каналов"
 
 #: midi_time_axis.cc:486
 msgid "Show Full Range"
@@ -7072,9 +7049,8 @@ msgid "Note Mode"
 msgstr "Режим представления нот"
 
 #: midi_time_axis.cc:497
-#, fuzzy
 msgid "Channel Selector"
-msgstr "Цвета канала"
+msgstr "Выбор каналов"
 
 #: midi_time_axis.cc:502
 msgid "Color Mode"
@@ -7138,13 +7114,12 @@ msgstr "Цвет дорожки"
 
 #: midi_time_axis.cc:1488 midi_time_axis.cc:1494 midi_time_axis.cc:1504
 #: midi_time_axis.cc:1510
-#, fuzzy
 msgid "all"
-msgstr "Маленькая"
+msgstr "все"
 
 #: midi_time_axis.cc:1491 midi_time_axis.cc:1507
 msgid "some"
-msgstr ""
+msgstr "не все"
 
 #: midi_tracer.cc:43
 msgid "Line history: "
@@ -7302,152 +7277,152 @@ msgstr ""
 msgid "Could not find mixer.bindings in search path %1"
 msgstr ""
 
-#: mixer_strip.cc:91 mixer_strip.cc:119 mixer_strip.cc:1720
+#: mixer_strip.cc:92 mixer_strip.cc:120 mixer_strip.cc:1720
 msgid "pre"
 msgstr "lj"
 
-#: mixer_strip.cc:93 mixer_strip.cc:121 mixer_strip.cc:352 mixer_strip.cc:1293
+#: mixer_strip.cc:94 mixer_strip.cc:122 mixer_strip.cc:353 mixer_strip.cc:1299
 #: rc_option_editor.cc:1873
 msgid "Comments"
 msgstr "Комментарии"
 
-#: mixer_strip.cc:145
+#: mixer_strip.cc:146
 msgid "Click to toggle the width of this mixer strip."
 msgstr "Щёлкните для переключения ширины полоски микшера"
 
-#: mixer_strip.cc:147
+#: mixer_strip.cc:148
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
 msgstr ""
 
-#: mixer_strip.cc:154
+#: mixer_strip.cc:155
 msgid "Hide this mixer strip"
 msgstr "Скрыть полоску микшера"
 
-#: mixer_strip.cc:165
+#: mixer_strip.cc:166
 msgid "Click to select metering point"
 msgstr "Щёлкните для выбора точка замера"
 
-#: mixer_strip.cc:171
+#: mixer_strip.cc:172
 msgid "tupni"
 msgstr ""
 
-#: mixer_strip.cc:190
+#: mixer_strip.cc:191
 msgid "Isolate Solo"
 msgstr "Изолировать соло"
 
-#: mixer_strip.cc:199
+#: mixer_strip.cc:200
 msgid "Lock Solo Status"
 msgstr "Статус блокировки солирования"
 
-#: mixer_strip.cc:201 mixer_strip.cc:1929
+#: mixer_strip.cc:202 mixer_strip.cc:1925
 msgid "lock"
 msgstr "Блок"
 
-#: mixer_strip.cc:202 mixer_strip.cc:1928
+#: mixer_strip.cc:203 mixer_strip.cc:1924
 msgid "iso"
 msgstr "Изол"
 
-#: mixer_strip.cc:256
+#: mixer_strip.cc:257
 msgid "Mix group"
 msgstr "Группа микса"
 
-#: mixer_strip.cc:349 rc_option_editor.cc:1870
+#: mixer_strip.cc:350 rc_option_editor.cc:1870
 msgid "Phase Invert"
 msgstr "Инверсия фазы"
 
-#: mixer_strip.cc:350 rc_option_editor.cc:1871 route_ui.cc:1213
+#: mixer_strip.cc:351 rc_option_editor.cc:1871 route_ui.cc:1213
 msgid "Solo Safe"
 msgstr "Блокировка солирования"
 
-#: mixer_strip.cc:353 mixer_ui.cc:124 route_time_axis.cc:664
+#: mixer_strip.cc:354 mixer_ui.cc:124 route_time_axis.cc:673
 msgid "Group"
 msgstr "Группа"
 
-#: mixer_strip.cc:354 rc_option_editor.cc:1874
+#: mixer_strip.cc:355 rc_option_editor.cc:1874
 msgid "Meter Point"
 msgstr "Точка измерения"
 
-#: mixer_strip.cc:466
+#: mixer_strip.cc:469
 msgid "Enable/Disable MIDI input"
 msgstr "Включить или выключить MIDI-вход"
 
-#: mixer_strip.cc:616
+#: mixer_strip.cc:621
 msgid ""
 "Aux\n"
 "Sends"
 msgstr ""
 
-#: mixer_strip.cc:640
+#: mixer_strip.cc:645
 msgid "Snd"
 msgstr "Псл"
 
-#: mixer_strip.cc:694 mixer_strip.cc:822 processor_box.cc:2152
+#: mixer_strip.cc:700 mixer_strip.cc:828 processor_box.cc:2141
 msgid "Not connected to JACK - no I/O changes are possible"
 msgstr "Нет соединения с JACK, любые изменения входа-выхода невозможны"
 
-#: mixer_strip.cc:1089
+#: mixer_strip.cc:1095
 msgid "<b>INPUT</b> to %1"
 msgstr "<b>ВХОД</b> в %1"
 
-#: mixer_strip.cc:1092
+#: mixer_strip.cc:1098
 msgid "<b>OUTPUT</b> from %1"
 msgstr "<b>ВЫХОД</b> из %1"
 
-#: mixer_strip.cc:1167
+#: mixer_strip.cc:1173
 msgid "Disconnected"
 msgstr "Нет соединения"
 
-#: mixer_strip.cc:1296
+#: mixer_strip.cc:1302
 msgid "*Comments*"
 msgstr "*Кмт*"
 
-#: mixer_strip.cc:1303
+#: mixer_strip.cc:1309
 msgid "Cmt"
 msgstr "Кмт"
 
-#: mixer_strip.cc:1306
+#: mixer_strip.cc:1312
 msgid "*Cmt*"
 msgstr "*Кмт*"
 
-#: mixer_strip.cc:1312
+#: mixer_strip.cc:1318
 msgid "Click to Add/Edit Comments"
 msgstr "Нажмите для добавления/правки комментариев"
 
-#: mixer_strip.cc:1351
+#: mixer_strip.cc:1357
 msgid ": comment editor"
 msgstr ": редактор комментариев"
 
-#: mixer_strip.cc:1428
+#: mixer_strip.cc:1434
 msgid "Grp"
 msgstr "Грп"
 
-#: mixer_strip.cc:1431
+#: mixer_strip.cc:1437
 msgid "~G"
 msgstr "нГр"
 
-#: mixer_strip.cc:1460
+#: mixer_strip.cc:1466
 msgid "Comments..."
 msgstr "Комментарии..."
 
-#: mixer_strip.cc:1462
+#: mixer_strip.cc:1468
 msgid "Save As Template..."
 msgstr "Сохранить как шаблон..."
 
-#: mixer_strip.cc:1468 route_group_dialog.cc:39 route_time_axis.cc:687
+#: mixer_strip.cc:1474 route_group_dialog.cc:39 route_time_axis.cc:696
 msgid "Active"
 msgstr "Активность"
 
-#: mixer_strip.cc:1475
+#: mixer_strip.cc:1481
 msgid "Adjust Latency..."
 msgstr "Скорректировать задержку..."
 
-#: mixer_strip.cc:1478
+#: mixer_strip.cc:1484
 msgid "Protect Against Denormals"
 msgstr "Защищать от отклонений"
 
-#: mixer_strip.cc:1484 route_time_axis.cc:426
+#: mixer_strip.cc:1490 route_time_axis.cc:435
 msgid "Remote Control ID..."
 msgstr "ID для удалённого управления..."
 
@@ -7487,31 +7462,63 @@ msgstr ""
 msgid "Disk"
 msgstr "Диск"
 
-#: mixer_strip.cc:1920 monitor_section.cc:63
+#: mixer_strip.cc:1917 monitor_section.cc:63
 msgid "AFL"
 msgstr "AFL"
 
-#: mixer_strip.cc:1923 monitor_section.cc:64
+#: mixer_strip.cc:1920 monitor_section.cc:64
 msgid "PFL"
 msgstr "PFL"
 
-#: mixer_strip.cc:1936
+#: mixer_strip.cc:1932
 msgid "D"
 msgstr ""
 
-#: mixer_strip.cc:1959
+#: mixer_strip.cc:1952
 #, fuzzy
 msgid "i"
 msgstr "вх"
 
-#: mixer_strip.cc:2133
+#: mixer_strip.cc:2127
 msgid "Pre-fader"
 msgstr "До фейдера"
 
-#: mixer_strip.cc:2134
+#: mixer_strip.cc:2128
 msgid "Post-fader"
 msgstr "После фейдера"
 
+#: mixer_strip.cc:2135 meter_strip.cc:575
+msgid "Peak"
+msgstr "Пиковое значение"
+
+#: mixer_strip.cc:2136 meter_strip.cc:576
+msgid "RMS + Peak"
+msgstr "Среднеквадратичное + пиковое значение"
+
+#: mixer_strip.cc:2155 meter_strip.cc:579
+msgid "Change all in Group to Peak"
+msgstr "Поменять все в группе на пиковое"
+
+#: mixer_strip.cc:2156 meter_strip.cc:580
+msgid "Change all in Group to RMS + Peak"
+msgstr "Поменять все в группе на среднеквадратичное + пиковое"
+
+#: mixer_strip.cc:2157 meter_strip.cc:581
+msgid "Change all to Peak"
+msgstr "Поменять все на пиковое"
+
+#: mixer_strip.cc:2158 meter_strip.cc:582
+msgid "Change all to RMS + Peak"
+msgstr "Поменять все на среднеквадратичное + пиковое"
+
+#: mixer_strip.cc:2159 meter_strip.cc:583
+msgid "Change same track-type to Peak"
+msgstr "Поменять дорожки одного типа на пиковое"
+
+#: mixer_strip.cc:2160 meter_strip.cc:584
+msgid "Change same track-type to RMS + Peak"
+msgstr "Поменять дорожки одного типа на среднеквадратичное + пиковое"
+
 #: mixer_ui.cc:1189
 msgid "track display list item for renamed strip not found!"
 msgstr ""
@@ -7520,7 +7527,7 @@ msgstr ""
 msgid "-all-"
 msgstr "-все-"
 
-#: mixer_ui.cc:1792
+#: mixer_ui.cc:1794
 msgid "Strips"
 msgstr "Каналы"
 
@@ -7681,7 +7688,7 @@ msgstr "Левый:%3d, Правый:%3d"
 
 #: mono_panner_editor.cc:33
 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
@@ -7904,7 +7911,7 @@ msgstr ""
 msgid "Panner (2D)"
 msgstr "Панорамирование (2D)"
 
-#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:452
+#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:451
 msgid "Bypass"
 msgstr "Обход"
 
@@ -8077,7 +8084,7 @@ msgstr "По категории"
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr "Что? У эффектов LADSPA нет своих редакторов!"
 
-#: plugin_ui.cc:125 plugin_ui.cc:228
+#: plugin_ui.cc:125 plugin_ui.cc:227
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
@@ -8087,51 +8094,51 @@ msgstr ""
 msgid "unknown type of editor-supplying plugin"
 msgstr ""
 
-#: plugin_ui.cc:258
+#: plugin_ui.cc:257
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:330
+#: plugin_ui.cc:329
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr ""
 
-#: plugin_ui.cc:418
+#: plugin_ui.cc:417
 msgid "Add"
 msgstr "Добавить"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:421
 msgid "Description"
 msgstr "Описание"
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:422
 msgid "Plugin analysis"
 msgstr "Частотный анализ модуля"
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:429
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
 msgstr "Все доступные профили этого модуля,как «заводские», так и собственные"
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:430
 msgid "Save a new preset"
 msgstr "Сохранить новый профиль"
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:431
 msgid "Save the current preset"
 msgstr "Сохранить текущий профиль"
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:432
 msgid "Delete the current preset"
 msgstr "Удалить текущий профиль"
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:433
 msgid "Disable signal processing by the plugin"
 msgstr "Выключить обработку сигнала этим модулем"
 
-#: plugin_ui.cc:467 plugin_ui.cc:632
+#: plugin_ui.cc:466 plugin_ui.cc:662
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
@@ -8139,30 +8146,42 @@ msgstr ""
 "Щёлкните, чтобы разрешить этому модулю получать клавиатурные события, "
 "которые %1 обычно использует как горячие клавиши"
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:467
 msgid "Click to enable/disable this plugin"
 msgstr "Щелкните, чтобы включить или отключить этот модуль"
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:506
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] "Задержка (%1 сэмпл)"
 msgstr[1] "Задержка (%1 сэмпла)"
 msgstr[2] "Задержка (%1 сэмплов)"
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:508
 msgid "latency (%1 ms)"
 msgstr "Задержка (%1 мс)"
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:519
 msgid "Edit Latency"
 msgstr "Изменить задержку"
 
-#: plugin_ui.cc:559
+#: plugin_ui.cc:558
 msgid "Plugin preset %1 not found"
 msgstr "Предустановка модуля %1 не обнаружена"
 
-#: plugin_ui.cc:639
+#: plugin_ui.cc:595
+msgid ""
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"full version"
+msgstr ""
+
+#: plugin_ui.cc:615 plugin_ui.cc:630
+msgid ""
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"newer version"
+msgstr ""
+
+#: plugin_ui.cc:669
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr ""
 "Щёлкните, чтобы переключиться на обычное использование горячих клавиш %1"
@@ -8267,46 +8286,46 @@ msgstr "Выполняется определение..."
 msgid "Port Insert "
 msgstr "Вставка порта"
 
-#: port_matrix.cc:323 port_matrix.cc:342
+#: port_matrix.cc:325 port_matrix.cc:344
 msgid "<b>Sources</b>"
 msgstr "<b>Источники</b>"
 
-#: port_matrix.cc:324 port_matrix.cc:343
+#: port_matrix.cc:326 port_matrix.cc:345
 msgid "<b>Destinations</b>"
 msgstr "<b>Назначения</b>"
 
-#: port_matrix.cc:419 port_matrix.cc:427
+#: port_matrix.cc:421 port_matrix.cc:429
 #, c-format
 msgid "Add %s %s"
 msgstr "Добавить %s %s"
 
-#: port_matrix.cc:435
+#: port_matrix.cc:437
 #, c-format
 msgid "Rename '%s'..."
 msgstr "Переименовать '%s'..."
 
-#: port_matrix.cc:451
+#: port_matrix.cc:453
 msgid "Remove all"
 msgstr "Удалить все"
 
-#: port_matrix.cc:471 port_matrix.cc:483
+#: port_matrix.cc:473 port_matrix.cc:485
 #, c-format
 msgid "%s all"
 msgstr "%s все"
 
-#: port_matrix.cc:506
+#: port_matrix.cc:508
 msgid "Rescan"
 msgstr "Просканировать заново"
 
-#: port_matrix.cc:508
+#: port_matrix.cc:510
 msgid "Show individual ports"
 msgstr "Показывать порты раздельно"
 
-#: port_matrix.cc:514
+#: port_matrix.cc:516
 msgid "Flip"
 msgstr "Повернуть матрицу"
 
-#: port_matrix.cc:702
+#: port_matrix.cc:704
 msgid ""
 "It is not possible to add a port here, as the first processor in the track "
 "or buss cannot support the new configuration."
@@ -8314,31 +8333,31 @@ msgstr ""
 "Невозможно добавить сюда порт, поскольку первый обработчик дорожки или шины "
 "не может поддерживать новую конфигурацию."
 
-#: port_matrix.cc:705
+#: port_matrix.cc:707
 msgid "Cannot add port"
 msgstr "Невозможно добавить порт"
 
-#: port_matrix.cc:727
+#: port_matrix.cc:729
 msgid "Port removal not allowed"
 msgstr "Удаление портов не разрешено"
 
-#: port_matrix.cc:728
+#: port_matrix.cc:730
 msgid ""
 "This port cannot be removed, as the first plugin in the track or buss cannot "
 "accept the new number of inputs."
 msgstr ""
 
-#: port_matrix.cc:945
+#: port_matrix.cc:947
 #, c-format
 msgid "Remove '%s'"
 msgstr "Удалить '%s'"
 
-#: port_matrix.cc:960
+#: port_matrix.cc:962
 #, c-format
 msgid "%s all from '%s'"
 msgstr "%s все из '%s'"
 
-#: port_matrix.cc:1026
+#: port_matrix.cc:1028
 msgid "channel"
 msgstr "канал"
 
@@ -8356,12 +8375,17 @@ msgid ""
 "Double-click to show GUI.\n"
 "Alt+double-click to show generic GUI."
 msgstr ""
+"<b>%1</b>\n"
+"Двойной щелчок вызывает собственный диалог модуля.\n"
+"Alt+ двойной щелчок вызывает генерируемый хостом диалог с параметрами."
 
 #: processor_box.cc:258
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI."
 msgstr ""
+"<b>%1</b>\n"
+"Двойной щелчок вызывает генерируемый хостом диалог с параметрами."
 
 #: processor_box.cc:371
 msgid "Show All Controls"
@@ -8518,52 +8542,51 @@ msgstr ""
 "послефейдерные обработчики из \"%1\" ?\n"
 "(отмена невозможна)"
 
-#: processor_box.cc:2198
+#: processor_box.cc:2187
 msgid "New Plugin"
 msgstr "Добавить модуль"
 
-#: processor_box.cc:2201
+#: processor_box.cc:2190
 msgid "New Insert"
 msgstr "Добавить возврат"
 
-#: processor_box.cc:2204
+#: processor_box.cc:2193
 msgid "New External Send ..."
 msgstr "Добавить внешний посыл с портом JACK..."
 
-#: processor_box.cc:2208
+#: processor_box.cc:2197
 msgid "New Aux Send ..."
 msgstr "Добавить внешний посыл без порта JACK..."
 
-#: processor_box.cc:2212
+#: processor_box.cc:2201
 msgid "Clear (all)"
 msgstr "Очистить (всё)"
 
-#: processor_box.cc:2214
+#: processor_box.cc:2203
 msgid "Clear (pre-fader)"
 msgstr "Очистить (до фейдера)"
 
-#: processor_box.cc:2216
+#: processor_box.cc:2205
 msgid "Clear (post-fader)"
 msgstr "Очистить (после фейдера)"
 
-#: processor_box.cc:2242
+#: processor_box.cc:2231
 msgid "Activate All"
 msgstr "Активировать все"
 
-#: processor_box.cc:2244
+#: processor_box.cc:2233
 msgid "Deactivate All"
 msgstr "Деактивировать все"
 
-#: processor_box.cc:2246
+#: processor_box.cc:2235
 msgid "A/B Plugins"
 msgstr "Отключить все"
 
-#: processor_box.cc:2255
-#, fuzzy
+#: processor_box.cc:2244
 msgid "Edit with generic controls..."
 msgstr "Изменить с интерфейсом хоста..."
 
-#: processor_box.cc:2531
+#: processor_box.cc:2544
 msgid "%1: %2 (by %3)"
 msgstr "%1: %2 (автор — %3)"
 
@@ -8684,7 +8707,6 @@ msgid "Recording (seconds of buffering):"
 msgstr "Запись (в секундах):"
 
 #: rc_option_editor.cc:656
-#, fuzzy
 msgid "Control Surface Protocol"
 msgstr "Устройства управления"
 
@@ -8700,15 +8722,15 @@ msgstr ""
 
 #: rc_option_editor.cc:817
 msgid "Show Video Export Info before export"
-msgstr ""
+msgstr "Показывать диалог с вводной информацией об экспорте видео"
 
 #: rc_option_editor.cc:818
 msgid "Show Video Server Startup Dialog"
-msgstr ""
+msgstr "Показывать диалог с параметрами видеосервера"
 
 #: rc_option_editor.cc:819
 msgid "Advanced Setup (remote video server)"
-msgstr ""
+msgstr "Дополнительные параметры (удалённого видеосервера)"
 
 #: rc_option_editor.cc:827
 msgid ""
@@ -8718,7 +8740,7 @@ msgstr ""
 
 #: rc_option_editor.cc:829
 msgid "Video Server URL:"
-msgstr ""
+msgstr "URL видеосервера:"
 
 #: rc_option_editor.cc:834
 msgid ""
@@ -8728,9 +8750,8 @@ msgid ""
 msgstr ""
 
 #: rc_option_editor.cc:836
-#, fuzzy
 msgid "Video Folder:"
-msgstr "Папка:"
+msgstr "Папка с видео:"
 
 #: rc_option_editor.cc:841
 msgid ""
@@ -8746,12 +8767,16 @@ msgid ""
 "<b>When enabled</b> an information window with details is displayed before "
 "the video-export dialog."
 msgstr ""
+"<b>Если включено,</b> перед экспортом видео показывается окно со справочной "
+"информацией"
 
 #: rc_option_editor.cc:853
 msgid ""
 "<b>When enabled</b> the video server is never launched automatically without "
 "confirmation"
 msgstr ""
+"<b>Если включено,</b> видеосервер никогда автоматически не запускается без "
+"подтверждения"
 
 #: rc_option_editor.cc:993
 msgid "%1 Preferences"
@@ -8813,7 +8838,7 @@ msgstr "Максимальное число недавних сеансов"
 msgid "Click gain level"
 msgstr "Уровень щелчка метронома"
 
-#: rc_option_editor.cc:1083 route_time_axis.cc:206 route_time_axis.cc:667
+#: rc_option_editor.cc:1083 route_time_axis.cc:215 route_time_axis.cc:676
 msgid "Automation"
 msgstr "Автоматизация"
 
@@ -9269,23 +9294,23 @@ msgstr "Солирование приоритетнее приглушения"
 
 #: rc_option_editor.cc:1665
 msgid "Default track / bus muting options"
-msgstr "Параметры приглушения дорожки/шины по умолчанию"
+msgstr "Приглушение дорожек и шин по умолчанию затрагивает"
 
 #: rc_option_editor.cc:1670
 msgid "Mute affects pre-fader sends"
-msgstr "Приглушение затрагивает предфейдерные посылы"
+msgstr "Предфейдерные посылы"
 
 #: rc_option_editor.cc:1678
 msgid "Mute affects post-fader sends"
-msgstr "Приглушение затрагивает послефейдерные посылы"
+msgstr "Послефейдерные посылы"
 
 #: rc_option_editor.cc:1686
 msgid "Mute affects control outputs"
-msgstr "Приглушение затрагивает выходы мониторинга"
+msgstr "Выходы мониторинга"
 
 #: rc_option_editor.cc:1694
 msgid "Mute affects main outputs"
-msgstr "Приглушение затрагивает основные выходы"
+msgstr "Основные выходы"
 
 #: rc_option_editor.cc:1710
 msgid "Send MIDI Time Code"
@@ -9341,6 +9366,9 @@ msgid ""
 "   <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:1812
 msgid "Keyboard"
@@ -9364,10 +9392,10 @@ msgstr "Следуют порядку редактора"
 
 #: rc_option_editor.cc:1838 rc_option_editor.cc:1846 rc_option_editor.cc:1856
 #: rc_option_editor.cc:1877 rc_option_editor.cc:1886 rc_option_editor.cc:1894
-#: rc_option_editor.cc:1908 rc_option_editor.cc:1925
-#, fuzzy
+#: rc_option_editor.cc:1908 rc_option_editor.cc:1927 rc_option_editor.cc:1943
+#: rc_option_editor.cc:1957
 msgid "Preferences|GUI"
-msgstr "Параметры"
+msgstr "Интерфейс"
 
 #: rc_option_editor.cc:1841
 msgid "Graphically indicate mouse pointer hovering over various widgets"
@@ -9383,7 +9411,7 @@ msgstr "Интерфейс"
 
 #: rc_option_editor.cc:1862
 msgid "update transport clock display every 40ms instead of every 100ms"
-msgstr ""
+msgstr "Обновлять счётчик транспорта каждые 40мс вместо каждых 100мс"
 
 #: rc_option_editor.cc:1879
 msgid "Mixer Strip"
@@ -9394,14 +9422,14 @@ msgid "Use narrow strips in the mixer by default"
 msgstr "Использовать тонкие полоски в микшере по умолчанию"
 
 #: rc_option_editor.cc:1898
-msgid "Meter hold time"
-msgstr "Задержка индикатора"
+msgid "Peak hold time"
+msgstr "Удерживание пика"
 
 #: rc_option_editor.cc:1904
 msgid "short"
 msgstr "Короткое"
 
-#: rc_option_editor.cc:1905 rc_option_editor.cc:1920
+#: rc_option_editor.cc:1905
 msgid "medium"
 msgstr "Среднее"
 
@@ -9410,28 +9438,74 @@ msgid "long"
 msgstr "Долгое"
 
 #: rc_option_editor.cc:1912
-msgid "Meter fall-off"
-msgstr "Спадание индикатора"
+msgid "DPM fall-off"
+msgstr "Скорость спадания"
 
 #: rc_option_editor.cc:1918
-msgid "slowest"
-msgstr "Самое медленное"
+msgid "slowest [6.6dB/sec]"
+msgstr "Самое медленное [6,6 Дб/с]"
 
 #: rc_option_editor.cc:1919
-msgid "slow"
-msgstr "Медленное"
+msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
+msgstr "Медленное [8,6 Дб/с] (BBC PPM, EBU PPM)"
+
+#: rc_option_editor.cc:1920
+msgid "slowish [12.0dB/sec] (DIN)"
+msgstr "Неторопливое [12  Дб/с] (DIN)"
 
 #: rc_option_editor.cc:1921
-msgid "fast"
-msgstr "Быстрое"
+msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr "Умеренное [13,3 Дб/с] (EBU Digi PPM, IRT Digi PPM)"
 
 #: rc_option_editor.cc:1922
-msgid "faster"
-msgstr "Ещё более быстрее"
+msgid "medium [20dB/sec]"
+msgstr "Среднее [20  Дб/с]"
 
 #: rc_option_editor.cc:1923
-msgid "fastest"
-msgstr "Скорейшее"
+msgid "fast [32dB/sec]"
+msgstr "Быстрое [32 Дб/с]"
+
+#: rc_option_editor.cc:1924
+msgid "faster [46dB/sec]"
+msgstr "Ещё быстрее [46 Дб/с]"
+
+#: rc_option_editor.cc:1925
+msgid "fastest [70dB/sec]"
+msgstr "Самое быстрое [70 Дб/с]"
+
+#: rc_option_editor.cc:1931
+msgid "Meter line-up level"
+msgstr "Уровень выравнивания"
+
+#: rc_option_editor.cc:1936
+msgid "-24dB"
+msgstr "-24 Дб"
+
+#: rc_option_editor.cc:1937
+msgid "-20dB (SMPTE)"
+msgstr "-20 Дб (SMPTE)"
+
+#: rc_option_editor.cc:1938
+msgid "-18dB (EBU)"
+msgstr "-18 Дб (EBU)"
+
+#: rc_option_editor.cc:1939
+msgid "-15dB"
+msgstr "-15 Дб"
+
+#: rc_option_editor.cc:1941
+msgid "Configure meter-ticks and color-knee point."
+msgstr ""
+
+#: rc_option_editor.cc:1947
+msgid "Peak threshold [dBFS]"
+msgstr "Порог пика (dbFS)"
+
+#: rc_option_editor.cc:1955
+msgid ""
+"Specify the audio signal level in dbFS at and above which the meter-peak "
+"indicator will flash red."
+msgstr ""
 
 #: region_editor.cc:79
 msgid "audition this region"
@@ -9445,7 +9519,7 @@ msgstr "Позиция:"
 msgid "End:"
 msgstr "Конец:"
 
-#: region_editor.cc:92 sfdb_ui.cc:140
+#: region_editor.cc:92 sfdb_ui.cc:141
 msgid "Length:"
 msgstr "Длительность:"
 
@@ -9469,23 +9543,23 @@ msgstr "Источники:"
 msgid "Source:"
 msgstr "Источник:"
 
-#: region_editor.cc:167
+#: region_editor.cc:166
 msgid "Region '%1'"
 msgstr "Область %1"
 
-#: region_editor.cc:274
+#: region_editor.cc:273
 msgid "change region start position"
 msgstr "смена позиции начала области"
 
-#: region_editor.cc:290
+#: region_editor.cc:289
 msgid "change region end position"
 msgstr "смена позиции конца области"
 
-#: region_editor.cc:310
+#: region_editor.cc:309
 msgid "change region length"
 msgstr "смена длительности области"
 
-#: region_editor.cc:404 region_editor.cc:416
+#: region_editor.cc:403 region_editor.cc:415
 msgid "change region sync point"
 msgstr "смена синхронизатора областей"
 
@@ -9693,198 +9767,197 @@ msgstr "Выходы"
 msgid "Plugins, Inserts & Sends"
 msgstr "Модули, возвраты и посылы"
 
-#: route_params_ui.cc:211
+#: route_params_ui.cc:207
 msgid "route display list item for renamed route not found!"
 msgstr ""
 
-#: route_params_ui.cc:258 route_params_ui.cc:286
+#: route_params_ui.cc:254 route_params_ui.cc:282
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr "Задержка воспроизведения: %<PRId64> сэмплов"
 
-#: route_params_ui.cc:478
+#: route_params_ui.cc:474
 msgid "NO TRACK"
 msgstr "НЕТ ДОРОЖЕК"
 
-#: route_params_ui.cc:611 route_params_ui.cc:612
+#: route_params_ui.cc:607 route_params_ui.cc:608
 msgid "No Track or Bus Selected"
 msgstr "Нет выбранных дорожек или шин"
 
-#: route_time_axis.cc:96
+#: route_time_axis.cc:97
 msgid "g"
 msgstr "г"
 
-#: route_time_axis.cc:97
+#: route_time_axis.cc:98
 msgid "p"
 msgstr "сп"
 
-#: route_time_axis.cc:98
+#: route_time_axis.cc:99
 msgid "a"
 msgstr "а"
 
-#: route_time_axis.cc:168
+#: route_time_axis.cc:173
 msgid "Record (Right-click for Step Edit)"
 msgstr "Запись (правая клавиша мыши активирует пошаговый ввод)"
 
-#: route_time_axis.cc:171
+#: route_time_axis.cc:176
 msgid "Record"
 msgstr "Запись"
 
-#: route_time_axis.cc:201
+#: route_time_axis.cc:210
 msgid "Route Group"
 msgstr "Группа маршрутизации"
 
-#: route_time_axis.cc:204
+#: route_time_axis.cc:213
 msgid "MIDI Controllers and Automation"
 msgstr "MIDI-контроллеры и автоматизация"
 
-#: route_time_axis.cc:381
+#: route_time_axis.cc:390
 msgid "Show All Automation"
 msgstr "Показать всю автоматизацию"
 
-#: route_time_axis.cc:384
+#: route_time_axis.cc:393
 msgid "Show Existing Automation"
 msgstr "Показать существующую автоматизацию"
 
-#: route_time_axis.cc:387
+#: route_time_axis.cc:396
 msgid "Hide All Automation"
 msgstr "Скрыть всю автоматизацию"
 
-#: route_time_axis.cc:396
-#, fuzzy
+#: route_time_axis.cc:405
 msgid "Processor automation"
-msgstr "Очистить автоматизацию"
+msgstr "Автоматизация обработчика"
 
-#: route_time_axis.cc:415
+#: route_time_axis.cc:424
 msgid "Color..."
 msgstr "Цвет..."
 
-#: route_time_axis.cc:472
+#: route_time_axis.cc:481
 msgid "Overlaid"
 msgstr "Перекрывают друг друга"
 
-#: route_time_axis.cc:478
+#: route_time_axis.cc:487
 msgid "Stacked"
 msgstr "В стопке"
 
-#: route_time_axis.cc:486
+#: route_time_axis.cc:495
 msgid "Layers"
 msgstr "Слои"
 
-#: route_time_axis.cc:555
+#: route_time_axis.cc:564
 msgid "Automatic (based on I/O connections)"
 msgstr "Автоматическое (по соединениям входа-выхода)"
 
-#: route_time_axis.cc:564
+#: route_time_axis.cc:573
 msgid "(Currently: Existing Material)"
 msgstr "(Сейчас: с записанным материалом)"
 
-#: route_time_axis.cc:567
+#: route_time_axis.cc:576
 msgid "(Currently: Capture Time)"
 msgstr "(Сейчас: по времени захвата)"
 
-#: route_time_axis.cc:575
+#: route_time_axis.cc:584
 msgid "Align With Existing Material"
 msgstr "С записанным материалом"
 
-#: route_time_axis.cc:580
+#: route_time_axis.cc:589
 msgid "Align With Capture Time"
 msgstr "По времени захвата"
 
-#: route_time_axis.cc:585
+#: route_time_axis.cc:594
 msgid "Alignment"
 msgstr "Выравнивание"
 
-#: route_time_axis.cc:620
+#: route_time_axis.cc:629
 msgid "Normal Mode"
 msgstr "Обычный режим"
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:635
 msgid "Tape Mode"
 msgstr "Плёночный режим"
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:641
 msgid "Non-Layered Mode"
 msgstr "Бесслойный режим"
 
-#: route_time_axis.cc:645 route_time_axis.cc:1587
+#: route_time_axis.cc:654 route_time_axis.cc:1601
 msgid "Playlist"
 msgstr "Список"
 
-#: route_time_axis.cc:965
+#: route_time_axis.cc:979
 msgid "Rename Playlist"
 msgstr "Переименовать список воспроизведения"
 
-#: route_time_axis.cc:966
+#: route_time_axis.cc:980
 msgid "New name for playlist:"
 msgstr "Новое название списка воспроизведения:"
 
-#: route_time_axis.cc:1051
+#: route_time_axis.cc:1065
 msgid "New Copy Playlist"
 msgstr "Новая копия списка воспроизведения"
 
-#: route_time_axis.cc:1052 route_time_axis.cc:1105
+#: route_time_axis.cc:1066 route_time_axis.cc:1119
 msgid "Name for new playlist:"
 msgstr "Название нового списка воспроизведения:"
 
-#: route_time_axis.cc:1104
+#: route_time_axis.cc:1118
 msgid "New Playlist"
 msgstr "Новый список воспроизведения"
 
-#: route_time_axis.cc:1295
+#: route_time_axis.cc:1309
 msgid "You cannot create a track with that name as it is reserved for %1"
 msgstr ""
 "Вы не можете добавить дорожку с названием, которое зарезервировано для %1"
 
-#: route_time_axis.cc:1476
+#: route_time_axis.cc:1490
 msgid "New Copy..."
 msgstr "Создать копию..."
 
-#: route_time_axis.cc:1480
+#: route_time_axis.cc:1494
 msgid "New Take"
 msgstr "Новый дубль"
 
-#: route_time_axis.cc:1481
+#: route_time_axis.cc:1495
 msgid "Copy Take"
 msgstr "Скопировать дубль"
 
-#: route_time_axis.cc:1486
+#: route_time_axis.cc:1500
 msgid "Clear Current"
 msgstr "Очистить текущий"
 
-#: route_time_axis.cc:1489
+#: route_time_axis.cc:1503
 msgid "Select From All..."
 msgstr "Выбрать из всех..."
 
-#: route_time_axis.cc:1577
+#: route_time_axis.cc:1591
 msgid "Take: %1.%2"
 msgstr "Дубль: %1.%2"
 
-#: route_time_axis.cc:2267
+#: route_time_axis.cc:2291
 msgid "Underlays"
 msgstr ""
 
-#: route_time_axis.cc:2270
+#: route_time_axis.cc:2294
 msgid "Remove \"%1\""
 msgstr "Удалить «%1»"
 
-#: route_time_axis.cc:2320 route_time_axis.cc:2357
+#: route_time_axis.cc:2344 route_time_axis.cc:2381
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr ""
 
-#: route_time_axis.cc:2388
+#: route_time_axis.cc:2408
 msgid "After-fade listen (AFL)"
 msgstr "Прослушивание после фейдера (AFL)"
 
-#: route_time_axis.cc:2392
+#: route_time_axis.cc:2412
 msgid "Pre-fade listen (PFL)"
 msgstr "Прослушивание до фейдера (PFL)"
 
-#: route_time_axis.cc:2396
+#: route_time_axis.cc:2416
 msgid "s"
 msgstr "с"
 
-#: route_time_axis.cc:2400
+#: route_time_axis.cc:2419
 msgid "m"
 msgstr "м"
 
@@ -10439,6 +10512,7 @@ msgid ""
 "Use Video File's FPS Instead of Timecode Value for Timeline and Video "
 "Monitor."
 msgstr ""
+"Использовать частоту кадров видео вместо таймкода в проекте и видеомониторе"
 
 #: session_option_editor.cc:91
 msgid ""
@@ -10618,155 +10692,207 @@ msgstr "Приклеивать новые маркеры к тактам и до
 msgid "Glue new regions to bars and beats"
 msgstr "Приклеивать новые области к тактам и долям"
 
-#: sfdb_ui.cc:87 sfdb_ui.cc:107 sfdb_ui.cc:116
+#: session_option_editor.cc:275 session_option_editor.cc:277
+#: session_option_editor.cc:284 session_option_editor.cc:291
+#: session_option_editor.cc:298 session_option_editor.cc:300
+#: session_option_editor.cc:307 session_option_editor.cc:314
+#: session_option_editor.cc:321 session_option_editor.cc:323
+msgid "Meterbridge"
+msgstr "Панель индикаторов"
+
+#: session_option_editor.cc:275
+msgid "Route Display"
+msgstr "Показывать в маршрутизации"
+
+#: session_option_editor.cc:279
+msgid "Show Midi Tracks"
+msgstr "MIDI-дорожки"
+
+#: session_option_editor.cc:286
+msgid "Show Busses"
+msgstr "Шины"
+
+#: session_option_editor.cc:293
+msgid "Include Master Bus"
+msgstr "Мастер-шина"
+
+#: session_option_editor.cc:298
+msgid "Button Area"
+msgstr "Показывать в кнопках"
+
+#: session_option_editor.cc:302
+msgid "Rec-enable Button"
+msgstr "Переключатель записываемости"
+
+#: session_option_editor.cc:309
+msgid "Mute Button"
+msgstr "Переключатель приглушения"
+
+#: session_option_editor.cc:316
+msgid "Solo Button"
+msgstr "Переключатель солирования"
+
+#: session_option_editor.cc:321
+msgid "Name Labels"
+msgstr "Показывать в метках имён"
+
+#: session_option_editor.cc:325
+msgid "Track Name"
+msgstr "Название дорожи"
+
+#: sfdb_ui.cc:88 sfdb_ui.cc:108 sfdb_ui.cc:117
 msgid "as new tracks"
 msgstr "как новые дорожки"
 
-#: sfdb_ui.cc:89 sfdb_ui.cc:109
+#: sfdb_ui.cc:90 sfdb_ui.cc:110
 msgid "to selected tracks"
 msgstr "в выделенные дорожки"
 
-#: sfdb_ui.cc:91 sfdb_ui.cc:111
+#: sfdb_ui.cc:92 sfdb_ui.cc:112
 msgid "to region list"
 msgstr "в список областей"
 
-#: sfdb_ui.cc:93 sfdb_ui.cc:113
+#: sfdb_ui.cc:94 sfdb_ui.cc:114
 msgid "as new tape tracks"
 msgstr "как новые плёночные дорожки"
 
-#: sfdb_ui.cc:97
+#: sfdb_ui.cc:98
 msgid "programming error: unknown import mode string %1"
 msgstr "Ошибка в программе: неизвестная строка режима импорта %1"
 
-#: sfdb_ui.cc:124
+#: sfdb_ui.cc:125
 msgid "Auto-play"
 msgstr "Автовоспр."
 
-#: sfdb_ui.cc:130 sfdb_ui.cc:237
+#: sfdb_ui.cc:131 sfdb_ui.cc:238
 msgid "<b>Sound File Information</b>"
 msgstr "<b>Информация о файле</b>"
 
-#: sfdb_ui.cc:142
+#: sfdb_ui.cc:143
 msgid "Timestamp:"
 msgstr "Отметка времени:"
 
-#: sfdb_ui.cc:144
+#: sfdb_ui.cc:145
 msgid "Format:"
 msgstr "Формат:"
 
-#: sfdb_ui.cc:183 sfdb_ui.cc:530
+#: sfdb_ui.cc:184 sfdb_ui.cc:529
 msgid "Tags:"
 msgstr "Метки:"
 
-#: sfdb_ui.cc:320
+#: sfdb_ui.cc:321
 msgid "Auditioning of MIDI files is not yet supported"
 msgstr "Прослушивание файлов MIDI пока что не реализовано"
 
-#: sfdb_ui.cc:327
+#: sfdb_ui.cc:328
 msgid "Could not read file: %1 (%2)."
 msgstr "Не удалось прочитать файл: %1 (%2)"
 
-#: sfdb_ui.cc:349
+#: sfdb_ui.cc:350
 msgid "Could not access soundfile: "
 msgstr "Файл недоступен: "
 
-#: sfdb_ui.cc:403
+#: sfdb_ui.cc:404
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr ""
 
-#: sfdb_ui.cc:423 sfdb_ui.cc:425
+#: sfdb_ui.cc:424 sfdb_ui.cc:426
 msgid "Search"
 msgstr "Искать"
 
-#: sfdb_ui.cc:449
+#: sfdb_ui.cc:450
 msgid "Audio and MIDI files"
 msgstr "Звуковые и MIDI-файлы"
 
-#: sfdb_ui.cc:452
+#: sfdb_ui.cc:453
 msgid "Audio files"
 msgstr "Звуковые файлы"
 
-#: sfdb_ui.cc:455
+#: sfdb_ui.cc:456
 msgid "MIDI files"
 msgstr "Файлы MIDI"
 
-#: sfdb_ui.cc:458 add_video_dialog.cc:131
+#: sfdb_ui.cc:459 add_video_dialog.cc:131
 msgid "All files"
 msgstr "Все файлы"
 
-#: sfdb_ui.cc:477 add_video_dialog.cc:142
+#: sfdb_ui.cc:478 add_video_dialog.cc:142
 msgid "Browse Files"
 msgstr "Обзор файлов"
 
-#: sfdb_ui.cc:506
+#: sfdb_ui.cc:507
 msgid "Paths"
 msgstr "Расположения"
 
-#: sfdb_ui.cc:517
+#: sfdb_ui.cc:516
 msgid "Search Tags"
 msgstr "Поиск по меткам"
 
-#: sfdb_ui.cc:535
+#: sfdb_ui.cc:534
 msgid "Sort:"
 msgstr "Критерий сортировки:"
 
-#: sfdb_ui.cc:543
+#: sfdb_ui.cc:542
 msgid "Longest"
 msgstr "Более длинные"
 
-#: sfdb_ui.cc:544
+#: sfdb_ui.cc:543
 msgid "Shortest"
 msgstr "Более короткие"
 
-#: sfdb_ui.cc:545
+#: sfdb_ui.cc:544
 msgid "Newest"
 msgstr "Более новые"
 
-#: sfdb_ui.cc:546
+#: sfdb_ui.cc:545
 msgid "Oldest"
 msgstr "Более старые"
 
-#: sfdb_ui.cc:547
+#: sfdb_ui.cc:546
 msgid "Most downloaded"
 msgstr "Чаще скачиваемые"
 
-#: sfdb_ui.cc:548
+#: sfdb_ui.cc:547
 msgid "Least downloaded"
 msgstr "Реже скачиваемые"
 
-#: sfdb_ui.cc:549
+#: sfdb_ui.cc:548
 msgid "Highest rated"
 msgstr "Выше оценённые"
 
-#: sfdb_ui.cc:550
+#: sfdb_ui.cc:549
 msgid "Lowest rated"
 msgstr "Ниже оценённые"
 
-#: sfdb_ui.cc:555
+#: sfdb_ui.cc:554
 msgid "More"
 msgstr ""
 
-#: sfdb_ui.cc:572
+#: sfdb_ui.cc:558
+msgid "Similar"
+msgstr ""
+
+#: sfdb_ui.cc:570
 msgid "ID"
 msgstr "ID"
 
-#: sfdb_ui.cc:573 add_video_dialog.cc:83
+#: sfdb_ui.cc:571 add_video_dialog.cc:83
 msgid "Filename"
 msgstr "Имя файла"
 
-#: sfdb_ui.cc:575
+#: sfdb_ui.cc:573
 msgid "Duration"
 msgstr "Длительность"
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:574
 msgid "Size"
 msgstr "Размер"
 
-#: sfdb_ui.cc:577
+#: sfdb_ui.cc:575
 msgid "Samplerate"
 msgstr "Частота сэмплирования"
 
-#: sfdb_ui.cc:578
+#: sfdb_ui.cc:576
 msgid "License"
 msgstr "Лицензия"
 
@@ -10787,88 +10913,70 @@ msgstr ""
 msgid "Press to close this window without importing any files"
 msgstr "Нажмите, чтобы закрыть это окно, ничего не импортируя"
 
-#: sfdb_ui.cc:846
-msgid "found %1 match"
-msgid_plural "found %1 matches"
-msgstr[0] "Найдено %1 совпадение"
-msgstr[1] "Найдено %1 совпадения"
-msgstr[2] "Найдено %1 совпадений"
-
-#: sfdb_ui.cc:862
+#: sfdb_ui.cc:813
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr ""
 
-#: sfdb_ui.cc:960
+#: sfdb_ui.cc:1013
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Ещё %1 страница из 100 доступных"
+msgstr[1] "Ещё %1 страницы из 100 доступных"
+msgstr[2] "Ещё %1 страниц из 100 доступных"
 
-#: sfdb_ui.cc:965
+#: sfdb_ui.cc:1018
 msgid "No more results available"
-msgstr ""
+msgstr "Больше результатов нет"
 
-#: sfdb_ui.cc:1029
+#: sfdb_ui.cc:1082
 msgid "B"
 msgstr "Б"
 
-#: sfdb_ui.cc:1031
+#: sfdb_ui.cc:1084
 msgid "kB"
 msgstr "КБ"
 
-#: sfdb_ui.cc:1033 sfdb_ui.cc:1035
+#: sfdb_ui.cc:1086 sfdb_ui.cc:1088
 msgid "MB"
 msgstr "МБ"
 
-#: sfdb_ui.cc:1037
+#: sfdb_ui.cc:1090
 msgid "GB"
 msgstr "ГБ"
 
-#: sfdb_ui.cc:1070
-msgid "Search returned no results."
-msgstr ""
-
-#: sfdb_ui.cc:1072
-msgid "Found %1 match"
-msgid_plural "Found %1 matches"
-msgstr[0] "Найдено %1 совпадение"
-msgstr[1] "Найдено %1 совпадения"
-msgstr[2] "Найдено %1 совпадений"
-
-#: sfdb_ui.cc:1277 sfdb_ui.cc:1585 sfdb_ui.cc:1635 sfdb_ui.cc:1653
+#: sfdb_ui.cc:1304 sfdb_ui.cc:1612 sfdb_ui.cc:1662 sfdb_ui.cc:1680
 msgid "one track per file"
 msgstr "Одна дорожка на файл"
 
-#: sfdb_ui.cc:1280 sfdb_ui.cc:1636 sfdb_ui.cc:1654
+#: sfdb_ui.cc:1307 sfdb_ui.cc:1663 sfdb_ui.cc:1681
 msgid "one track per channel"
 msgstr "Одна дорожка на канал"
 
-#: sfdb_ui.cc:1288 sfdb_ui.cc:1638 sfdb_ui.cc:1655
+#: sfdb_ui.cc:1315 sfdb_ui.cc:1665 sfdb_ui.cc:1682
 msgid "sequence files"
 msgstr ""
 
-#: sfdb_ui.cc:1291 sfdb_ui.cc:1643
+#: sfdb_ui.cc:1318 sfdb_ui.cc:1670
 msgid "all files in one track"
 msgstr "Все файлы в одну дорожку"
 
-#: sfdb_ui.cc:1292 sfdb_ui.cc:1637
+#: sfdb_ui.cc:1319 sfdb_ui.cc:1664
 msgid "merge files"
 msgstr "Объединить файлы"
 
-#: sfdb_ui.cc:1298 sfdb_ui.cc:1640
+#: sfdb_ui.cc:1325 sfdb_ui.cc:1667
 msgid "one region per file"
 msgstr "Одна область на файл"
 
-#: sfdb_ui.cc:1301 sfdb_ui.cc:1641
+#: sfdb_ui.cc:1328 sfdb_ui.cc:1668
 msgid "one region per channel"
 msgstr "Одна область на канал"
 
-#: sfdb_ui.cc:1306 sfdb_ui.cc:1642 sfdb_ui.cc:1656
+#: sfdb_ui.cc:1333 sfdb_ui.cc:1669 sfdb_ui.cc:1683
 msgid "all files in one region"
 msgstr "Все файлы в одной области"
 
-#: sfdb_ui.cc:1373
+#: sfdb_ui.cc:1400
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
@@ -10876,55 +10984,55 @@ msgstr ""
 "Один или более выбранных файлов\n"
 "не могут быть использованы в %1"
 
-#: sfdb_ui.cc:1513
+#: sfdb_ui.cc:1540
 msgid "Copy files to session"
 msgstr "Скопировать файлы в сеанс"
 
-#: sfdb_ui.cc:1530 sfdb_ui.cc:1693
+#: sfdb_ui.cc:1557 sfdb_ui.cc:1720
 msgid "file timestamp"
 msgstr "По отметке времени файла"
 
-#: sfdb_ui.cc:1531 sfdb_ui.cc:1695
+#: sfdb_ui.cc:1558 sfdb_ui.cc:1722
 msgid "edit point"
 msgstr "По курсору редактора"
 
-#: sfdb_ui.cc:1532 sfdb_ui.cc:1697
+#: sfdb_ui.cc:1559 sfdb_ui.cc:1724
 msgid "playhead"
 msgstr "По указателю воспр."
 
-#: sfdb_ui.cc:1533
+#: sfdb_ui.cc:1560
 msgid "session start"
 msgstr "В начало сеанса"
 
-#: sfdb_ui.cc:1538
+#: sfdb_ui.cc:1565
 msgid "<b>Add files as ...</b>"
 msgstr "<b>Добавить файлы как...</b>"
 
-#: sfdb_ui.cc:1560
+#: sfdb_ui.cc:1587
 msgid "<b>Insert at</b>"
 msgstr "<b>Куда вставить</b>"
 
-#: sfdb_ui.cc:1573
+#: sfdb_ui.cc:1600
 msgid "<b>Mapping</b>"
 msgstr "<b>Способ вставки</b>"
 
-#: sfdb_ui.cc:1591
+#: sfdb_ui.cc:1618
 msgid "<b>Conversion quality</b>"
 msgstr "<b>Качество преобразования:</b>"
 
-#: sfdb_ui.cc:1603 sfdb_ui.cc:1709
+#: sfdb_ui.cc:1630 sfdb_ui.cc:1736
 msgid "Best"
 msgstr "Наилучшее"
 
-#: sfdb_ui.cc:1604 sfdb_ui.cc:1711
+#: sfdb_ui.cc:1631 sfdb_ui.cc:1738
 msgid "Good"
 msgstr "Хорошее"
 
-#: sfdb_ui.cc:1605 sfdb_ui.cc:1713
+#: sfdb_ui.cc:1632 sfdb_ui.cc:1740
 msgid "Quick"
 msgstr "Быстрое"
 
-#: sfdb_ui.cc:1607
+#: sfdb_ui.cc:1634
 msgid "Fastest"
 msgstr "Быстрее всего"
 
@@ -11190,10 +11298,6 @@ msgstr ""
 msgid "Click to open the program website in your web browser"
 msgstr ""
 
-#: startup.cc:594
-msgid "What would you like to do ?"
-msgstr "Что вы хотите сделать?"
-
 #: startup.cc:729
 msgid "Open"
 msgstr "Открыть"
@@ -11806,7 +11910,7 @@ msgstr "Рисовать кнопки плоскими"
 
 #: theme_manager.cc:61
 msgid "All floating windows are dialogs"
-msgstr ""
+msgstr "Все плавающие окна являются диалогами"
 
 #: theme_manager.cc:62
 msgid "Draw waveforms with color gradient"
@@ -11976,18 +12080,16 @@ msgid "VerboseCanvasCursor"
 msgstr "VerboseCanvasCursor"
 
 #: add_video_dialog.cc:54
-#, fuzzy
 msgid "Set Video Track"
-msgstr "Добавить звуковую дорожку"
+msgstr "Установка видеодорожки"
 
 #: add_video_dialog.cc:62
-#, fuzzy
 msgid "Launch External Video Monitor"
-msgstr "Внешний контроль"
+msgstr "Запустить внешний видеомонитор"
 
 #: add_video_dialog.cc:63
 msgid "Adjust Session Framerate to Match Video Framerate"
-msgstr ""
+msgstr "Подогнать частоту кадров сеанса к частоте кадров видео"
 
 #: add_video_dialog.cc:65
 msgid "Reload docroot"
@@ -11998,62 +12100,64 @@ msgid "VideoServerIndex"
 msgstr ""
 
 #: add_video_dialog.cc:128
-#, fuzzy
 msgid "Video files"
-msgstr "Звуковые файлы"
+msgstr "Видеофайлы"
 
 #: add_video_dialog.cc:163
-#, fuzzy
 msgid "<b>Video Information</b>"
-msgstr "<b>Информация о файле</b>"
+msgstr "<b>Информация о видеофайле</b>"
 
 #: add_video_dialog.cc:166
-#, fuzzy
 msgid "Start:"
-msgstr "Начало"
+msgstr "Начало:"
 
 #: add_video_dialog.cc:172
-#, fuzzy
 msgid "Frame rate:"
-msgstr "Частота сэмплирования:"
+msgstr "Частота кадров::"
 
 #: add_video_dialog.cc:175
 msgid "Aspect Ratio:"
-msgstr ""
+msgstr "Соотношение сторон:"
 
 #: add_video_dialog.cc:653
 msgid " %1 fps"
-msgstr ""
+msgstr " %1 к/с"
 
-#: editor_videotimeline.cc:138
-#, fuzzy
+#: editor_videotimeline.cc:146
 msgid "Export Successful: %1"
-msgstr "Экспорт MIDI: %1"
+msgstr "Экспорт успешно завершён: %1"
 
-#: video_timeline.cc:467
+#: 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 ""
 
-#: video_timeline.cc:501
+#: video_timeline.cc:505
 msgid "Failed to set session-framerate: "
 msgstr ""
 
-#: video_timeline.cc:501
+#: video_timeline.cc:505
 msgid " does not have a corresponding option setting in Ardour."
 msgstr ""
 
-#: video_timeline.cc:507
+#: video_timeline.cc:511
 msgid ""
 "Video file's framerate is not equal to Ardour session timecode's framerate: "
 msgstr ""
 
-#: video_timeline.cc:508
+#: video_timeline.cc:512
 msgid " vs "
 msgstr ""
 
-#: video_timeline.cc:690
+#: video_timeline.cc:583
+msgid ""
+"Video-server docroot mismatch. Ardour: '%1', video-server: '%2'. This "
+"usually means that the video server was not started by ardour and uses a "
+"different document-root."
+msgstr ""
+
+#: video_timeline.cc:732
 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 "
@@ -12061,10 +12165,9 @@ msgid ""
 "xjadeo's remote-control interface 'xjremote')."
 msgstr ""
 
-#: video_monitor.cc:282
-#, fuzzy
+#: video_monitor.cc:281
 msgid "Video Monitor: File Not Found."
-msgstr "Монитор"
+msgstr "Видеомонитор: файл не найден"
 
 #: transcode_ffmpeg.cc:71
 msgid ""
@@ -12083,23 +12186,20 @@ msgid ""
 msgstr ""
 
 #: transcode_video_dialog.cc:55
-#, fuzzy
 msgid "Transcode/Import Video File "
-msgstr "Экспортировать в файл"
+msgstr "Импортировать/перекодировать видеофайл"
 
 #: transcode_video_dialog.cc:57
-#, fuzzy
 msgid "Output File:"
-msgstr "Устройство выхода:"
+msgstr "Файл вывода:"
 
 #: transcode_video_dialog.cc:60 export_video_dialog.cc:72
 msgid "Abort"
-msgstr ""
+msgstr "Прервать"
 
 #: transcode_video_dialog.cc:62
-#, fuzzy
 msgid "Height = "
-msgstr "Высота"
+msgstr "Высота = "
 
 #: transcode_video_dialog.cc:65
 msgid "Manual Override"
@@ -12107,10 +12207,9 @@ msgstr ""
 
 #: transcode_video_dialog.cc:69
 msgid "Debug Mode: Print ffmpeg Command and Output to stdout."
-msgstr ""
+msgstr "Режим отладки: вывод команд ffmpeg в stdout"
 
 #: transcode_video_dialog.cc:106
-#, fuzzy
 msgid "<b>File Information</b>"
 msgstr "<b>Информация о файле</b>"
 
@@ -12129,101 +12228,91 @@ msgstr ""
 
 #: transcode_video_dialog.cc:133
 msgid "FPS:"
-msgstr ""
+msgstr "К/с:"
 
 #: transcode_video_dialog.cc:135
-#, fuzzy
 msgid "Duration:"
-msgstr "Длительность"
+msgstr "Длительность:"
 
 #: transcode_video_dialog.cc:137
 msgid "Codec:"
-msgstr ""
+msgstr "Кодек:"
 
 #: transcode_video_dialog.cc:139
 msgid "Geometry:"
-msgstr ""
+msgstr "Геометрия:"
 
 #: transcode_video_dialog.cc:154
-#, fuzzy
 msgid "??"
-msgstr "???"
+msgstr ""
 
 #: transcode_video_dialog.cc:175
-#, fuzzy
 msgid "<b>Import Settings</b>"
-msgstr "<b>Параметры</b>"
+msgstr "<b>Параметры импорта</b>"
 
 #: transcode_video_dialog.cc:180
 msgid "Do Not Import Video"
-msgstr ""
+msgstr "Не импортировать видео"
 
 #: transcode_video_dialog.cc:181
 msgid "Reference From Current Location"
-msgstr ""
+msgstr "Использовать исходный видеофайл"
 
 #: transcode_video_dialog.cc:183
-#, fuzzy
 msgid "Import/Transcode Video to Session"
-msgstr "Импортировать из сеанса"
+msgstr "Импортировать/перекодировать видео в сеанс"
 
 #: transcode_video_dialog.cc:197
 msgid "Scale Video: Width = "
-msgstr ""
+msgstr "Масштаб видео: Ширина = "
 
 #: transcode_video_dialog.cc:204
-#, fuzzy
 msgid "Original Width"
-msgstr "Исходное положение"
+msgstr "Исходная ширина"
 
 #: transcode_video_dialog.cc:219
 msgid "Bitrate (KBit/s):"
-msgstr ""
+msgstr "Скорость потока (Кбит/с):"
 
 #: transcode_video_dialog.cc:224
-#, fuzzy
 msgid "Extract Audio:"
-msgstr "Экспортировать звук"
+msgstr "Извлечь звук:"
 
 #: transcode_video_dialog.cc:344
-#, fuzzy
 msgid "Extracting Audio.."
-msgstr "Экспортировать звук"
+msgstr "Извлекается звук..."
 
 #: transcode_video_dialog.cc:347
 msgid "Audio Extraction Failed."
-msgstr ""
+msgstr "Не удалось извлечь звуковую дорожку."
 
 #: transcode_video_dialog.cc:373
 msgid "Transcoding Video.."
-msgstr ""
+msgstr "Перекодирование видео..."
 
 #: transcode_video_dialog.cc:407
-#, fuzzy
 msgid "Transcoding Failed."
-msgstr "Локализация включена"
+msgstr "Не удалось выполнить перекодирование."
 
 #: transcode_video_dialog.cc:490
-#, fuzzy
 msgid "Save Transcoded Video File"
-msgstr "Экспортировать в файл"
+msgstr "Сохранить перекодированный видеофайл"
 
 #: video_server_dialog.cc:42
 msgid "Launch Video Server"
-msgstr ""
+msgstr "Запустить видеосервер"
 
 #: video_server_dialog.cc:43
 msgid "Server Executable:"
-msgstr ""
+msgstr "Исполняемый файл сервера:"
 
 #: video_server_dialog.cc:45
-#, fuzzy
 msgid "Server Docroot:"
-msgstr "Сервер:"
+msgstr ""
 
 #: video_server_dialog.cc:51
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
-msgstr ""
+msgstr "Больше не показывать этот диалог"
 
 #: video_server_dialog.cc:90
 msgid ""
@@ -12234,17 +12323,15 @@ msgstr ""
 
 #: video_server_dialog.cc:117
 msgid "Listen Address:"
-msgstr ""
+msgstr "Слушать адрес:"
 
 #: video_server_dialog.cc:122
-#, fuzzy
 msgid "Listen Port:"
-msgstr "Положение прослушивания"
+msgstr "Слушать порт:"
 
 #: video_server_dialog.cc:127
-#, fuzzy
 msgid "Cache Size:"
-msgstr "Макс. размер"
+msgstr "Размер кэша:"
 
 #: video_server_dialog.cc:132
 msgid ""
@@ -12273,75 +12360,67 @@ msgstr ""
 
 #: utils_videotl.cc:56
 msgid "Continue"
-msgstr ""
+msgstr "Дальше"
 
 #: utils_videotl.cc:62
-#, fuzzy
 msgid "Confirm Overwrite"
-msgstr "Подтвердите перезапись снимка"
+msgstr "Подтвердите перезапись"
 
 #: utils_videotl.cc:63
-#, fuzzy
 msgid "A file with the same name already exists.  Do you want to overwrite it?"
 msgstr "Снимок с таким названием уже есть. Перезаписать его?"
 
 #: utils_videotl.cc:73 utils_videotl.cc:89
-#, fuzzy
 msgid "Cannot create video folder \"%1\" (%2)"
-msgstr "Не удалось создать пользовательскую папку %3:  %1 (%2)"
+msgstr "Не удалось создать папку для видео: \"%1\" (%2)"
 
 #: export_video_dialog.cc:65
-#, fuzzy
 msgid "Export Video File "
-msgstr "Экспортировать в файл"
+msgstr "Экспортировать видеофайл"
 
 #: export_video_dialog.cc:69
-#, fuzzy
 msgid "Video:"
-msgstr "Mike Start"
+msgstr "Видео:"
 
 #: export_video_dialog.cc:73
 msgid "Scale Video (W x H):"
-msgstr ""
+msgstr "Масштабирование видео (В×Ш):"
 
 #: export_video_dialog.cc:78
 msgid "Set Aspect Ratio:"
-msgstr ""
+msgstr "Указать соотношение сторон:"
 
 #: export_video_dialog.cc:79
-#, fuzzy
 msgid "Normalize Audio"
-msgstr "Нормировать до:"
+msgstr "Нормировать звук"
 
 #: export_video_dialog.cc:80
 msgid "2 Pass Encoding"
-msgstr ""
+msgstr "Кодирование в два прохода"
 
 #: export_video_dialog.cc:81
 msgid "Codec Optimizations:"
-msgstr ""
+msgstr "Оптимизация кодека:"
 
 #: export_video_dialog.cc:83
-#, fuzzy
 msgid "Deinterlace"
-msgstr "Указатель по центру"
+msgstr ""
 
 #: export_video_dialog.cc:84
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
-msgstr ""
+msgstr "Использовать [2] B-кадры (только MPEG 2 или 4)"
 
 #: export_video_dialog.cc:85
 msgid "Override FPS (Default is to retain FPS from the input video file):"
-msgstr ""
+msgstr "Принудительно указать свою частоту кадров:"
 
 #: export_video_dialog.cc:86
-#, fuzzy
 msgid "Include Session Metadata"
-msgstr "Метаданные сеанса"
+msgstr "Включить метаданные сеанса"
 
 #: export_video_dialog.cc:88
 msgid "Enable Debug Mode: Print ffmpeg Command & Output to stdout."
-msgstr ""
+msgstr "Включить режим отладки: направлять вывод ffmpeg в stdout"
 
 #: export_video_dialog.cc:106
 msgid ""
@@ -12351,120 +12430,114 @@ msgid ""
 msgstr ""
 
 #: export_video_dialog.cc:116
-#, fuzzy
 msgid "<b>Output:</b>"
-msgstr "<b>Выходы</b>"
+msgstr "<b>Выход:</b>"
 
 #: export_video_dialog.cc:126
-#, fuzzy
 msgid "<b>Input:</b>"
-msgstr "<b>Входы</b>"
+msgstr "<b>Вход:</b>"
 
 #: export_video_dialog.cc:137
-#, fuzzy
 msgid "Audio:"
-msgstr "Audio"
+msgstr "Звук:"
 
 #: export_video_dialog.cc:139
-#, fuzzy
 msgid "Master Bus"
 msgstr "Мастер-шина"
 
-#: export_video_dialog.cc:166
-#, fuzzy
+#: export_video_dialog.cc:144
+msgid "from the %1 session's start to the session's end"
+msgstr "от начала до конца сеанса %1"
+
+#: export_video_dialog.cc:148
+msgid "from 00:00:00:00 to the video's end"
+msgstr "от 00:00:00:00 до конца видео"
+
+#: export_video_dialog.cc:150
+msgid "from the video's start to the video's end"
+msgstr "от начала до конца видео"
+
+#: export_video_dialog.cc:183
 msgid "<b>Settings:</b>"
-msgstr "<b>Назначения</b>"
+msgstr "<b>Параметры:</b>"
 
-#: export_video_dialog.cc:174
-#, fuzzy
+#: export_video_dialog.cc:191
 msgid "Range:"
-msgstr "Диапазон"
+msgstr "Диапазон:"
 
-#: export_video_dialog.cc:177
-#, fuzzy
+#: export_video_dialog.cc:194
 msgid "Preset:"
-msgstr "Профиль"
+msgstr "Профиль:"
 
-#: export_video_dialog.cc:180
-#, fuzzy
+#: export_video_dialog.cc:197
 msgid "Video Codec:"
-msgstr "Папка:"
+msgstr "Видеокодек:"
 
-#: export_video_dialog.cc:183
-#, fuzzy
+#: export_video_dialog.cc:200
 msgid "Video KBit/s:"
-msgstr "Mike Start"
+msgstr "Скорость видеопотока (Кбит/с):"
 
-#: export_video_dialog.cc:186
-#, fuzzy
+#: export_video_dialog.cc:203
 msgid "Audio Codec:"
-msgstr "Звуковой режим:"
+msgstr "Звуковой кодек:"
 
-#: export_video_dialog.cc:189
-#, fuzzy
+#: export_video_dialog.cc:206
 msgid "Audio KBit/s:"
-msgstr "Звуковые файлы"
+msgstr "Скорость звукового потока (Кбит/с):"
 
-#: export_video_dialog.cc:192
-#, fuzzy
+#: export_video_dialog.cc:209
 msgid "Audio Samplerate:"
-msgstr "Частота сэмплирования:"
+msgstr "Частота сэмплирования звука:"
 
-#: export_video_dialog.cc:369
-#, fuzzy
+#: export_video_dialog.cc:386
 msgid "Normalizing audio"
-msgstr "Нормировать значения"
+msgstr "Выполняется нормировка звука"
 
-#: export_video_dialog.cc:373
-#, fuzzy
+#: export_video_dialog.cc:390
 msgid "Exporting audio"
-msgstr "Экспортировать звук"
+msgstr "Экспорт звука"
 
-#: export_video_dialog.cc:419
-#, fuzzy
-msgid "Exporting Audio.."
-msgstr "Экспортировать звук"
+#: export_video_dialog.cc:436
+msgid "Exporting Audio..."
+msgstr "Экспортируется звук..."
 
-#: export_video_dialog.cc:476
+#: export_video_dialog.cc:493
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
 msgstr ""
 
-#: export_video_dialog.cc:505
+#: export_video_dialog.cc:522
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 
-#: export_video_dialog.cc:544
-msgid "Encoding Video.."
-msgstr ""
+#: export_video_dialog.cc:561
+msgid "Encoding Video..."
+msgstr "Кодируется видео..."
 
-#: export_video_dialog.cc:563
+#: export_video_dialog.cc:580
 msgid "Export Video: Video input file cannot be read."
 msgstr ""
 
-#: export_video_dialog.cc:661
+#: export_video_dialog.cc:678
 msgid "Encoding Video.. Pass 1/2"
-msgstr ""
+msgstr "Выполняется кодирование видео. Проход 1/2."
 
-#: export_video_dialog.cc:673
+#: export_video_dialog.cc:690
 msgid "Encoding Video.. Pass 2/2"
-msgstr ""
+msgstr "Выполняется кодирование видео. Проход 2/2."
 
-#: export_video_dialog.cc:761
-#, fuzzy
+#: export_video_dialog.cc:778
 msgid "Transcoding failed."
-msgstr "Локализация включена"
+msgstr "Не удалось выполнить перекодировку."
 
-#: export_video_dialog.cc:930 export_video_dialog.cc:950
-#, fuzzy
+#: export_video_dialog.cc:947 export_video_dialog.cc:967
 msgid "Save Exported Video File"
-msgstr "Экспортировать в файл"
+msgstr "Сохранить экспортированный видеофайл"
 
 #: export_video_infobox.cc:30
-#, fuzzy
 msgid "Video Export Info"
-msgstr "Монитор"
+msgstr ""
 
 #: export_video_infobox.cc:31
 msgid "Do Not Show This Dialog Again (Reset in Edit > Preferences > Video)."
@@ -12472,35 +12545,58 @@ msgstr ""
 
 #: export_video_infobox.cc:43
 msgid "<b>Video Export Info</b>"
-msgstr ""
+msgstr "<b>Справка по экспорту видео</b>"
 
-#: export_video_infobox.cc:46
+#: export_video_infobox.cc:48
 msgid ""
-"Ardour video export is not recommended for mastering!\n"
-"While 'ffmpeg' (which is used by ardour) can produce high-quality files, "
-"this export lacks the possibility to tweak many settings. We recommend to "
-"use 'winff', 'devede' or 'dvdauthor' to mux & master. Nevertheless this "
-"video-export comes in handy to do quick snapshots, intermediates, dailies or "
-"online videos.\n"
-"\n"
-"The soundtrack is created from the master-bus of the current Ardour "
-"session.\n"
+"Video encoding is a non-trivial task with many details.\n"
 "\n"
-"The video soure defaults to the file used in the video timeline, which may "
-"not the best quality to start with, you should the original video file.\n"
+"Please see the manual at %1/video-timeline/operations/#export.\n"
 "\n"
-"If the export-range is longer than the original video, black video frames "
-"are prefixed and/or appended. This process may fail with non-standard pixel-"
-"aspect-ratios.\n"
-"\n"
-"The file-format is determined by the extension that you choose for the "
-"output file (.avi, .mov, .flv, .ogv,...)\n"
-"Note: not all combinations of format+codec+settings produce files which are "
-"according so spec. e.g. flv files require sample-rates of 22.1kHz or "
-"44.1kHz, mpeg containers can not be used with ac3 audio-codec, etc. If in "
-"doubt, use one of the built-in presets."
+"Open Manual in Browser? "
 msgstr ""
 
+#~ msgid "-Inf"
+#~ msgstr "-Inf"
+
+#~ msgid "slowest"
+#~ msgstr "Самое медленное"
+
+#~ msgid "slow"
+#~ msgstr "Медленное"
+
+#~ msgid "fast"
+#~ msgstr "Быстрое"
+
+#~ msgid "faster"
+#~ msgstr "Ещё более быстрее"
+
+#~ msgid "fastest"
+#~ msgstr "Скорейшее"
+
+#~ msgid "found %1 match"
+#~ msgid_plural "found %1 matches"
+#~ msgstr[0] "Найдено %1 совпадение"
+#~ msgstr[1] "Найдено %1 совпадения"
+#~ msgstr[2] "Найдено %1 совпадений"
+
+#~ msgid "Found %1 match"
+#~ msgid_plural "Found %1 matches"
+#~ msgstr[0] "Найдено %1 совпадение"
+#~ msgstr[1] "Найдено %1 совпадения"
+#~ msgstr[2] "Найдено %1 совпадений"
+
+#~ msgid "What would you like to do ?"
+#~ msgstr "Что вы хотите сделать?"
+
+#~ msgid "Control surfaces"
+#~ msgstr "Устройства управления"
+
+#~ msgid "Use plugins' own interfaces instead of %1's"
+#~ msgstr ""
+#~ "По возможности использовать собственный интерфейс модулей вместо "
+#~ "интерфейса %1"
+
 #~ msgid "Connect"
 #~ msgstr "Соединить"
 
@@ -12516,14 +12612,6 @@ msgstr ""
 #~ msgid "Add MIDI Track"
 #~ msgstr "Добавить MIDI-дорожку"
 
-#~ msgid "Control surfaces"
-#~ msgstr "Устройства управления"
-
-#~ msgid "Use plugins' own interfaces instead of %1's"
-#~ msgstr ""
-#~ "По возможности использовать собственный интерфейс модулей вместо "
-#~ "интерфейса %1"
-
 #~ msgid "Hid"
 #~ msgstr "Скрытый"
 
@@ -14295,9 +14383,6 @@ msgstr ""
 #~ msgid "solo change"
 #~ msgstr "смена солирования"
 
-#~ msgid "rec-enable change"
-#~ msgstr "смена записываемости"
-
 #~ msgid "Solo Lock"
 #~ msgstr "Запереть солирование"
 
diff --git a/gtk2_ardour/port_group.cc b/gtk2_ardour/port_group.cc
index 925bebc..531a5cf 100644
--- a/gtk2_ardour/port_group.cc
+++ b/gtk2_ardour/port_group.cc
@@ -574,8 +574,22 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
 	}
 
 	for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
-		if (!extra_other[*i].empty()) {
-			boost::shared_ptr<Bundle> b = make_bundle_from_ports (extra_other[*i], *i, inputs);
+		if (extra_other[*i].empty()) continue;
+		std::string cp;
+		std::vector<std::string> nb;
+		for (uint32_t j = 0; j < extra_other[*i].size(); ++j) {
+			std::string nn = extra_other[*i][j];
+			std::string pf = nn.substr (0, nn.find_first_of (":") + 1);
+			if (pf != cp && !nb.empty()) {
+				boost::shared_ptr<Bundle> b = make_bundle_from_ports (nb, *i, inputs);
+				other->add_bundle (b);
+				nb.clear();
+			}
+			cp = pf;
+			nb.push_back(extra_other[*i][j]);
+		}
+		if (!nb.empty()) {
+			boost::shared_ptr<Bundle> b = make_bundle_from_ports (nb, *i, inputs);
 			other->add_bundle (b);
 		}
 	}
diff --git a/gtk2_ardour/port_insert_ui.cc b/gtk2_ardour/port_insert_ui.cc
index 16beb75..0511b35 100644
--- a/gtk2_ardour/port_insert_ui.cc
+++ b/gtk2_ardour/port_insert_ui.cc
@@ -184,7 +184,7 @@ bool
 PortInsertWindow::wm_delete (GdkEventAny* /*event*/)
 {
 	accept ();
-	return true;
+	return false;
 }
 
 void
diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc
index 0fbbc03..2872ad6 100644
--- a/gtk2_ardour/port_matrix.cc
+++ b/gtk2_ardour/port_matrix.cc
@@ -152,6 +152,7 @@ PortMatrix::init ()
 
 	/* and also bundles */
 	_session->BundleAdded.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
+	_session->BundleRemoved.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
 
 	/* and also ports */
 	_session->engine().PortRegisteredOrUnregistered.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
@@ -180,6 +181,7 @@ PortMatrix::reconnect_to_routes ()
 	boost::shared_ptr<RouteList> routes = _session->get_routes ();
 	for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
 		(*i)->processors_changed.connect (_route_connections, invalidator (*this), boost::bind (&PortMatrix::route_processors_changed, this, _1), gui_context());
+		(*i)->DropReferences.connect (_route_connections, invalidator (*this), boost::bind (&PortMatrix::routes_changed, this), gui_context());
 	}
 }
 
@@ -198,6 +200,7 @@ PortMatrix::route_processors_changed (RouteProcessorChange c)
 void
 PortMatrix::routes_changed ()
 {
+	if (!_session) return;
 	reconnect_to_routes ();
 	setup_global_ports ();
 }
@@ -206,6 +209,11 @@ PortMatrix::routes_changed ()
 void
 PortMatrix::setup ()
 {
+	if (!_session) {
+		_route_connections.drop_connections ();
+		return; // session went away
+	}
+
 	/* this needs to be done first, as the visible_ports() method uses the
 	   notebook state to decide which ports are being shown */
 
@@ -328,6 +336,13 @@ PortMatrix::select_arrangement ()
 		_vbox.pack_end (_vnotebook, false, false);
 		_vbox.pack_end (_vspacer, true, true);
 
+#define REMOVE_FROM_GTK_PARENT(WGT) if ((WGT).get_parent()) { (WGT).get_parent()->remove(WGT);}
+		REMOVE_FROM_GTK_PARENT(*_body)
+		REMOVE_FROM_GTK_PARENT(_vscroll)
+		REMOVE_FROM_GTK_PARENT(_hscroll)
+		REMOVE_FROM_GTK_PARENT(_vbox)
+		REMOVE_FROM_GTK_PARENT(_hbox)
+
 		attach (*_body, 2, 3, 1, 2, FILL | EXPAND, FILL | EXPAND);
 		attach (_vscroll, 3, 4, 1, 2, SHRINK);
 		attach (_hscroll, 2, 3, 3, 4, FILL | EXPAND, SHRINK);
@@ -347,6 +362,12 @@ PortMatrix::select_arrangement ()
 		_vbox.pack_end (_vnotebook, false, false);
 		_vbox.pack_end (_vlabel, false, false);
 
+		REMOVE_FROM_GTK_PARENT(*_body)
+		REMOVE_FROM_GTK_PARENT(_vscroll)
+		REMOVE_FROM_GTK_PARENT(_hscroll)
+		REMOVE_FROM_GTK_PARENT(_vbox)
+		REMOVE_FROM_GTK_PARENT(_hbox)
+
 		attach (*_body, 1, 2, 2, 3, FILL | EXPAND, FILL | EXPAND);
 		attach (_vscroll, 3, 4, 2, 3, SHRINK);
 		attach (_hscroll, 1, 2, 3, 4, FILL | EXPAND, SHRINK);
@@ -725,7 +746,7 @@ PortMatrix::remove_channel (ARDOUR::BundleChannel b)
 			int const r = io->remove_port (p, this);
 			if (r == -1) {
 				ArdourDialog d (_("Port removal not allowed"));
-				Label l (_("This port cannot be removed, as the first plugin in the track or buss cannot accept the new number of inputs."));
+				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);
diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc
index 265f94c..1c5c47c 100644
--- a/gtk2_ardour/processor_box.cc
+++ b/gtk2_ardour/processor_box.cc
@@ -213,6 +213,7 @@ void
 ProcessorEntry::set_enum_width (Width w)
 {
 	_width = w;
+	_button.set_text (name (_width));
 }
 
 void
@@ -655,10 +656,15 @@ PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev)
 {
 	cairo_t* cr = gdk_cairo_create (get_window()->gobj());
 
-	cairo_set_line_width (cr, 1);
+	cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+	cairo_clip (cr);
+
+	cairo_set_line_width (cr, 1.5);
+	cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
 
-	double const width = ev->area.width;
-	double const height = ev->area.height;
+	Gtk::Allocation a = get_allocation();
+	double const width = a.get_width();
+	double const height = a.get_height();
 
 	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 ());
@@ -669,12 +675,19 @@ PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev)
 	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 ());
 
-	cairo_move_to (cr, width * 0.3, height);
-	cairo_line_to (cr, width * 0.3, height * 0.5);
-	cairo_line_to (cr, width * 0.7, height * 0.5);
-	cairo_line_to (cr, width * 0.7, height);
-	cairo_move_to (cr, width * 0.5, height * 0.5);
-	cairo_line_to (cr, width * 0.5, 0);
+	const float si_l = rint(width * 0.3) + .5;
+	const float si_c = rint(width * 0.5) + .5;
+	const float si_r = rint(width * 0.7) + .5;
+	const float si_m = rint(height * 0.5) + .5;
+
+	cairo_move_to (cr, si_l, height);
+	cairo_line_to (cr, si_l, si_m);
+	cairo_line_to (cr, si_r, si_m);
+	cairo_line_to (cr, si_r, height);
+
+	cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
+	cairo_move_to (cr, si_c, si_m);
+	cairo_line_to (cr, si_c, 0);
 	cairo_stroke (cr);
 
 	return true;
@@ -2031,7 +2044,7 @@ ProcessorBox::processor_can_be_edited (boost::shared_ptr<Processor> processor)
 	}
 
 	if (
-		(boost::dynamic_pointer_cast<Send> (processor) && !boost::dynamic_pointer_cast<InternalSend> (processor))||
+		boost::dynamic_pointer_cast<Send> (processor) ||
 		boost::dynamic_pointer_cast<Return> (processor) ||
 		boost::dynamic_pointer_cast<PluginInsert> (processor) ||
 		boost::dynamic_pointer_cast<PortInsert> (processor)
@@ -2086,17 +2099,6 @@ ProcessorBox::get_editor_window (boost::shared_ptr<Processor> processor, bool us
 		if (boost::dynamic_pointer_cast<InternalSend> (processor) == 0) {
 
 			gidget = new SendUIWindow (send, _session);
-
-		} else {
-			/* assign internal send to main fader */
-
-			if (_parent_strip) {
-				if (_parent_strip->current_delivery() == send) {
-					_parent_strip->revert_to_default_display ();
-				} else {
-					_parent_strip->show_send(send);
-				}
-			} 
 		}
 
 	} else if ((retrn = boost::dynamic_pointer_cast<Return> (processor)) != 0) {
@@ -2444,13 +2446,34 @@ ProcessorBox::rb_edit ()
 	_current_processor_box->for_selected_processors (&ProcessorBox::edit_processor);
 }
 
+bool
+ProcessorBox::edit_aux_send (boost::shared_ptr<Processor> processor)
+{
+	if (boost::dynamic_pointer_cast<InternalSend> (processor) == 0) {
+		return false;
+	}
+
+	if (_parent_strip) {
+		boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
+		if (_parent_strip->current_delivery() == send) {
+			_parent_strip->revert_to_default_display ();
+		} else {
+			_parent_strip->show_send(send);
+		}
+	}
+	return true;
+}
+
 void
 ProcessorBox::edit_processor (boost::shared_ptr<Processor> processor)
 {
 	if (!processor) {
 		return;
 	}
-	
+	if (edit_aux_send (processor)) {
+		return;
+	}
+
 	ProcessorWindowProxy* proxy = find_window_proxy (processor);
 
 	if (proxy) {
@@ -2465,7 +2488,10 @@ ProcessorBox::generic_edit_processor (boost::shared_ptr<Processor> processor)
 	if (!processor) {
 		return;
 	}
-	
+	if (edit_aux_send (processor)) {
+		return;
+	}
+
 	ProcessorWindowProxy* proxy = find_window_proxy (processor);
 
 	if (proxy) {
diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h
index d4d1456..a72eb32 100644
--- a/gtk2_ardour/processor_box.h
+++ b/gtk2_ardour/processor_box.h
@@ -258,6 +258,8 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
 
 	void hide_things ();
 
+	bool edit_aux_send(boost::shared_ptr<ARDOUR::Processor>);
+
         /* Everything except a WindowProxy object should use this to get the window */
 	Gtk::Window* get_processor_ui (boost::shared_ptr<ARDOUR::Processor>) const;
 
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index 96310d7..b5f8503 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -69,11 +69,7 @@ class AutomationTimeAxisView;
 class ControlPoint;
 class DragManager;
 class Editor;
-class ImageFrameTimeAxis;
-class ImageFrameView;
 class Marker;
-class MarkerTimeAxis;
-class MarkerView;
 class MeterMarker;
 class MouseCursors;
 class PlaylistSelector;
@@ -355,17 +351,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	virtual bool canvas_transport_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*) = 0;
 	virtual bool canvas_note_event (GdkEvent* event, ArdourCanvas::Item*) = 0;
 
-#ifdef WITH_CMT
-	virtual bool canvas_imageframe_item_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*) = 0;
-	virtual bool canvas_imageframe_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameTimeAxis*) = 0;
-	virtual bool canvas_imageframe_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*) = 0;
-	virtual bool canvas_imageframe_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*) = 0;
-	virtual bool canvas_marker_time_axis_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerTimeAxis*) = 0;
-	virtual bool canvas_markerview_item_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*) = 0;
-	virtual bool canvas_markerview_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*) = 0;
-	virtual bool canvas_markerview_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*) = 0;
-#endif
-
 	static const int window_border_width;
 	static const int container_border_width;
 	static const int vertical_spacing;
diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc
index da0e55c..98a4ffd 100644
--- a/gtk2_ardour/rc_option_editor.cc
+++ b/gtk2_ardour/rc_option_editor.cc
@@ -831,7 +831,7 @@ public:
 		t->attach (*l, 0, 1, 1, 2, FILL);
 		t->attach (_video_server_url_entry, 1, 2, 1, 2, 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 runing locally"));
+					    _("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);
@@ -1315,6 +1315,14 @@ RCOptionEditor::RCOptionEditor ()
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_track_meters)
 		     ));
 
+	add_option (_("Editor"),
+	     new BoolOption (
+		     "show-editor-meter",
+		     _("Display master-meter in the toolbar"),
+		     sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_editor_meter),
+		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_editor_meter)
+		     ));
+
 	bco = new BoolComboOption (
 		     "use-overlap-equivalency",
 		     _("Regions in active edit groups are edited together"),
@@ -1895,7 +1903,7 @@ RCOptionEditor::RCOptionEditor ()
 
 	ComboOption<float>* mht = new ComboOption<float> (
 		"meter-hold",
-		_("Meter hold time"),
+		_("Peak hold time"),
 		sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_hold),
 		sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_hold)
 		);
@@ -1909,20 +1917,91 @@ RCOptionEditor::RCOptionEditor ()
 
 	ComboOption<float>* mfo = new ComboOption<float> (
 		"meter-falloff",
-		_("Meter fall-off"),
+		_("DPM fall-off"),
 		sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_falloff),
 		sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_falloff)
 		);
 
-	mfo->add (METER_FALLOFF_OFF, _("off"));
-	mfo->add (METER_FALLOFF_SLOWEST, _("slowest"));
-	mfo->add (METER_FALLOFF_SLOW, _("slow"));
-	mfo->add (METER_FALLOFF_MEDIUM, _("medium"));
-	mfo->add (METER_FALLOFF_FAST, _("fast"));
-	mfo->add (METER_FALLOFF_FASTER, _("faster"));
-	mfo->add (METER_FALLOFF_FASTEST, _("fastest"));
+	mfo->add (METER_FALLOFF_OFF,      _("off"));
+	mfo->add (METER_FALLOFF_SLOWEST,  _("slowest [6.6dB/sec]"));
+	mfo->add (METER_FALLOFF_SLOW,     _("slow [8.6dB/sec] (BBC PPM, EBU PPM)"));
+	mfo->add (METER_FALLOFF_SLOWISH,  _("slowish [12.0dB/sec] (DIN)"));
+	mfo->add (METER_FALLOFF_MODERATE, _("moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"));
+	mfo->add (METER_FALLOFF_MEDIUM,   _("medium [20dB/sec]"));
+	mfo->add (METER_FALLOFF_FAST,     _("fast [32dB/sec]"));
+	mfo->add (METER_FALLOFF_FASTER,   _("faster [46dB/sec]"));
+	mfo->add (METER_FALLOFF_FASTEST,  _("fastest [70dB/sec]"));
 
 	add_option (S_("Preferences|GUI"), mfo);
+
+	ComboOption<MeterLineUp>* mlu = new ComboOption<MeterLineUp> (
+		"meter-line-up-level",
+		_("Meter line-up level; 0dBu"),
+		sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_level),
+		sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level)
+		);
+
+	mlu->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)"));
+	mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)"));
+	mlu->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)"));
+	mlu->add (MeteringLineUp15, _("-15dBFS (DIN)"));
+
+	Gtkmm2ext::UI::instance()->set_tip (mlu->tip_widget(), _("Configure meter-marks and color-knee point for dBFS scale DPM, set reference level for IEC1/Nordic, IEC2 PPM and VU meter."));
+
+	add_option (S_("Preferences|GUI"), mlu);
+
+	ComboOption<MeterLineUp>* mld = new ComboOption<MeterLineUp> (
+		"meter-line-up-din",
+		_("IEC1/DIN Meter line-up level; 0dBu"),
+		sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_din),
+		sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_din)
+		);
+
+	mld->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)"));
+	mld->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)"));
+	mld->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)"));
+	mld->add (MeteringLineUp15, _("-15dBFS (DIN)"));
+
+	Gtkmm2ext::UI::instance()->set_tip (mld->tip_widget(), _("Reference level for IEC1/DIN meter."));
+
+	add_option (S_("Preferences|GUI"), mld);
+
+	ComboOption<VUMeterStandard>* mvu = new ComboOption<VUMeterStandard> (
+		"meter-vu-standard",
+		_("VU Meter standard"),
+		sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_vu_standard),
+		sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard)
+		);
+
+	mvu->add (MeteringVUfrench,   _("0VU = -2dBu (France)"));
+	mvu->add (MeteringVUamerican, _("0VU = 0dBu (North America, Australia)"));
+	mvu->add (MeteringVUstandard, _("0VU = +4dBu (standard)"));
+	mvu->add (MeteringVUeight,    _("0VU = +8dBu"));
+
+	add_option (S_("Preferences|GUI"), mvu);
+
+	Gtk::Adjustment *mpk = manage (new Gtk::Adjustment(0, -10, 0, .1, .1));
+	HSliderOption *mpks = new HSliderOption("meter-peak",
+			_("Peak threshold [dBFS]"),
+			mpk,
+			sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_peak),
+			sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_peak)
+			);
+
+	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."));
+
+	add_option (S_("Preferences|GUI"), mpks);
+
+	add_option (S_("Preferences|GUI"),
+	     new BoolOption (
+		     "meter-style-led",
+		     _("LED meter style"),
+		     sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_style_led),
+		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_style_led)
+		     ));
+
 }
 
 void
diff --git a/gtk2_ardour/region_editor.cc b/gtk2_ardour/region_editor.cc
old mode 100755
new mode 100644
index 51e4ded..564938a
--- a/gtk2_ardour/region_editor.cc
+++ b/gtk2_ardour/region_editor.cc
@@ -161,7 +161,6 @@ RegionEditor::RegionEditor (Session* s, boost::shared_ptr<Region> r)
 	set_name ("RegionEditorWindow");
 	add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
 
-	signal_delete_event().connect (sigc::bind (sigc::ptr_fun (just_hide_it), static_cast<Window *> (this)));
 	signal_response().connect (sigc::mem_fun (*this, &RegionEditor::handle_response));
 
 	set_title (string_compose (_("Region '%1'"), _region->name()));
diff --git a/gtk2_ardour/return_ui.cc b/gtk2_ardour/return_ui.cc
index 8120534..592fff0 100644
--- a/gtk2_ardour/return_ui.cc
+++ b/gtk2_ardour/return_ui.cc
@@ -111,7 +111,6 @@ ReturnUIWindow::ReturnUIWindow (boost::shared_ptr<Return> r, ARDOUR::Session* s)
 	set_name ("ReturnUIWindow");
 
 	r->DropReferences.connect (going_away_connection, invalidator (*this), boost::bind (&ReturnUIWindow::return_going_away, this), gui_context());
-	signal_delete_event().connect (sigc::bind (sigc::ptr_fun (just_hide_it), reinterpret_cast<Window *> (this)));
 }
 
 ReturnUIWindow::~ReturnUIWindow ()
diff --git a/gtk2_ardour/route_params_ui.cc b/gtk2_ardour/route_params_ui.cc
index 56ed380..bb10bea 100644
--- a/gtk2_ardour/route_params_ui.cc
+++ b/gtk2_ardour/route_params_ui.cc
@@ -32,6 +32,7 @@
 #include "ardour/return.h"
 #include "ardour/route.h"
 #include "ardour/send.h"
+#include "ardour/internal_send.h"
 
 #include "ardour_ui.h"
 #include "gui_thread.h"
@@ -146,11 +147,7 @@ RouteParams_UI::RouteParams_UI ()
 	add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::BUTTON_RELEASE_MASK);
 
 	_plugin_selector = new PluginSelector (PluginManager::instance());
-	_plugin_selector->signal_delete_event().connect (sigc::bind (ptr_fun (just_hide_it),
-						     static_cast<Window *> (_plugin_selector)));
-
-
-	signal_delete_event().connect(sigc::bind(ptr_fun(just_hide_it), static_cast<Gtk::Window *>(this)));
+	show_all();
 }
 
 RouteParams_UI::~RouteParams_UI ()
@@ -514,7 +511,12 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
 	boost::shared_ptr<PluginInsert> plugin_insert;
 	boost::shared_ptr<PortInsert> port_insert;
 
-	if ((send = boost::dynamic_pointer_cast<Send> (proc)) != 0) {
+	if ((boost::dynamic_pointer_cast<InternalSend> (proc)) != 0) {
+		cleanup_view();
+		_processor.reset ((Processor*) 0);
+		update_title();
+		return;
+	} else if ((send = boost::dynamic_pointer_cast<Send> (proc)) != 0) {
 
 		SendUI *send_ui = new SendUI (this, send, _session);
 
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index 174ccee..b0fec29 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -43,6 +43,7 @@
 #include <gtkmm2ext/utils.h>
 
 #include "ardour/amp.h"
+#include "ardour/meter.h"
 #include "ardour/event_type_map.h"
 #include "ardour/processor.h"
 #include "ardour/profile.h"
@@ -112,9 +113,13 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
 {
 	RouteUI::set_route (rt);
 
+	int meter_width = 3;
+	if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) {
+		meter_width = 6;
+	}
 	gm.set_controls (_route, _route->shared_peak_meter(), _route->amp());
 	gm.get_level_meter().set_no_show_all();
-	gm.get_level_meter().setup_meters(50);
+	gm.get_level_meter().setup_meters(50, meter_width);
 	gm.update_gain_sensitive ();
 
 	string str = gui_property ("height");
@@ -181,8 +186,12 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
 	} else {
 		gm.set_fader_name ("AudioBusFader");
 	}
-	
-	controls_hbox.pack_start(gm.get_level_meter(), false, false);
+
+	Gtk::VBox *mtrbox = manage(new Gtk::VBox());
+	mtrbox->pack_start(gm.get_level_meter(), false, false, 2);
+	controls_hbox.pack_start(*mtrbox, false, false, 4);
+	mtrbox->show();
+
 	_route->meter_change.connect (*this, invalidator (*this), bind (&RouteTimeAxisView::meter_changed, this), gui_context());
 	_route->input()->changed.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::io_changed, this, _1, _2), gui_context());
 	_route->output()->changed.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::io_changed, this, _1, _2), gui_context());
@@ -829,9 +838,14 @@ RouteTimeAxisView::show_selection (TimeSelection& ts)
 void
 RouteTimeAxisView::set_height (uint32_t h)
 {
-	int gmlen = h - 5;
+	int gmlen = h - 9;
 	bool height_changed = (height == 0) || (h != height);
-	gm.get_level_meter().setup_meters (gmlen);
+
+	int meter_width = 3;
+	if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) {
+		meter_width = 6;
+	}
+	gm.get_level_meter().setup_meters (gmlen, meter_width);
 
 	TimeAxisView::set_height (h);
 
@@ -2228,7 +2242,11 @@ void
 RouteTimeAxisView::reset_meter ()
 {
 	if (Config->get_show_track_meters()) {
-		gm.get_level_meter().setup_meters (height-5);
+		int meter_width = 3;
+		if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) {
+			meter_width = 6;
+		}
+		gm.get_level_meter().setup_meters (height - 9, meter_width);
 	} else {
 		hide_meter ();
 	}
@@ -2245,12 +2263,18 @@ RouteTimeAxisView::meter_changed ()
 {
 	ENSURE_GUI_THREAD (*this, &RouteTimeAxisView::meter_changed)
 	reset_meter();
+	if (_route && !no_redraw) {
+		request_redraw ();
+	}
 }
 
 void
 RouteTimeAxisView::io_changed (IOChange /*change*/, void */*src*/)
 {
 	reset_meter ();
+	if (_route && !no_redraw) {
+		request_redraw ();
+	}
 }
 
 void
@@ -2372,31 +2396,26 @@ RouteTimeAxisView::remove_underlay (StreamView* v)
 void
 RouteTimeAxisView::set_button_names ()
 {
-        if (_route && _route->solo_safe()) {
-		solo_button->remove ();
-		if (solo_safe_pixbuf == 0) {
-			solo_safe_pixbuf = ::get_icon("solo-safe-icon");
-		}
-		solo_button->set_image (solo_safe_pixbuf);
-		solo_button->set_text (string());
-        } else {
-		solo_button->set_image (Glib::RefPtr<Gdk::Pixbuf>());
-                if (Config->get_solo_control_is_listen_control()) {
-                        switch (Config->get_listen_position()) {
-                        case AfterFaderListen:
-                                solo_button->set_text (_("A"));
+	if (_route && _route->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));
+	}
+	if (Config->get_solo_control_is_listen_control()) {
+		switch (Config->get_listen_position()) {
+			case AfterFaderListen:
+				solo_button->set_text (_("A"));
 				ARDOUR_UI::instance()->set_tip (*solo_button, _("After-fade listen (AFL)"));
-                                break;
-                        case PreFaderListen:
-                                solo_button->set_text (_("P"));
+				break;
+			case PreFaderListen:
+				solo_button->set_text (_("P"));
 				ARDOUR_UI::instance()->set_tip (*solo_button, _("Pre-fade listen (PFL)"));
-                                break;
-                        }
-                } else {
-                        solo_button->set_text (_("s"));
-			ARDOUR_UI::instance()->set_tip (*solo_button, _("Solo"));
-                }
-        }
+			break;
+		}
+	} else {
+		solo_button->set_text (_("s"));
+		ARDOUR_UI::instance()->set_tip (*solo_button, _("Solo"));
+	}
 	mute_button->set_text (_("m"));
 }
 
diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc
index b109061..c1dde89 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -61,13 +61,18 @@ using namespace ARDOUR;
 using namespace PBD;
 
 uint32_t RouteUI::_max_invert_buttons = 3;
-sigc::signal<void, boost::shared_ptr<Route> > RouteUI::BusSendDisplayChanged;
+PBD::Signal1<void, boost::shared_ptr<Route> > RouteUI::BusSendDisplayChanged;
 boost::weak_ptr<Route> RouteUI::_showing_sends_to;
 
 RouteUI::RouteUI (ARDOUR::Session* sess)
 	: AxisView(sess)
+	, mute_menu(0)
+	, solo_menu(0)
+	, sends_menu(0)
+	, record_menu(0)
+	, _invert_menu(0)
 {
-	init ();
+	if (sess) init ();
 }
 
 RouteUI::~RouteUI()
@@ -166,7 +171,7 @@ RouteUI::init ()
 	monitor_disk_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_press));
 	monitor_disk_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_release));
 
-	BusSendDisplayChanged.connect (sigc::mem_fun (*this, &RouteUI::bus_send_display_changed));
+	BusSendDisplayChanged.connect_same_thread (*this, boost::bind(&RouteUI::bus_send_display_changed, this, _1));
 }
 
 void
@@ -254,7 +259,7 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
 
 	mute_button->show();
 
-	if (_route->is_monitor()) {
+	if (_route->is_monitor() || _route->is_master()) {
 		solo_button->hide ();
 	} else {
 		solo_button->show();
diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h
index 0501c78..245101f 100644
--- a/gtk2_ardour/route_ui.h
+++ b/gtk2_ardour/route_ui.h
@@ -225,7 +225,7 @@ class RouteUI : public virtual AxisView
 	 *  by a click on the `Sends' button.  The parameter is the route that the sends are
 	 *  to, or 0 if no route is now in this mode.
 	 */
-	static sigc::signal<void, boost::shared_ptr<ARDOUR::Route> > BusSendDisplayChanged;
+	static PBD::Signal1<void, boost::shared_ptr<ARDOUR::Route> > BusSendDisplayChanged;
 
    protected:
 	PBD::ScopedConnectionList route_connections;
diff --git a/gtk2_ardour/send_ui.cc b/gtk2_ardour/send_ui.cc
index e9699f2..4a16c57 100644
--- a/gtk2_ardour/send_ui.cc
+++ b/gtk2_ardour/send_ui.cc
@@ -133,10 +133,6 @@ SendUIWindow::SendUIWindow (boost::shared_ptr<Send> s, Session* session)
 	hpacker.show ();
 
 	s->DropReferences.connect (going_away_connection, invalidator (*this), boost::bind (&SendUIWindow::send_going_away, this), gui_context());
-
-	signal_delete_event().connect (sigc::bind (
-					       sigc::ptr_fun (just_hide_it),
-					       reinterpret_cast<Window *> (this)));
 }
 
 SendUIWindow::~SendUIWindow ()
diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc
index 17f909a..1815db1 100644
--- a/gtk2_ardour/session_option_editor.cc
+++ b/gtk2_ardour/session_option_editor.cc
@@ -271,6 +271,62 @@ SessionOptionEditor::SessionOptionEditor (Session* s)
 			    sigc::mem_fun (*_session_config, &SessionConfiguration::get_glue_new_regions_to_bars_and_beats),
 			    sigc::mem_fun (*_session_config, &SessionConfiguration::set_glue_new_regions_to_bars_and_beats)
 			    ));
+
+	add_option (_("Meterbridge"), new OptionEditorHeading (_("Route Display")));
+
+	add_option (_("Meterbridge"), new BoolOption (
+			    "show-midi-on-meterbridge",
+			    _("Show Midi Tracks"),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_midi_on_meterbridge),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_midi_on_meterbridge)
+			    ));
+
+	add_option (_("Meterbridge"), new BoolOption (
+			    "show-busses-on-meterbridge",
+			    _("Show Busses"),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_busses_on_meterbridge),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_busses_on_meterbridge)
+			    ));
+
+	add_option (_("Meterbridge"), new BoolOption (
+			    "show-master-on-meterbridge",
+			    _("Include Master Bus"),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_master_on_meterbridge),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_master_on_meterbridge)
+			    ));
+
+	add_option (_("Meterbridge"), new OptionEditorHeading (_("Button Area")));
+
+	add_option (_("Meterbridge"), new BoolOption (
+			    "show-rec-on-meterbridge",
+			    _("Rec-enable Button"),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_rec_on_meterbridge),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_rec_on_meterbridge)
+			    ));
+
+	add_option (_("Meterbridge"), new BoolOption (
+			    "show-mute-on-meterbridge",
+			    _("Mute Button"),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_mute_on_meterbridge),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_mute_on_meterbridge)
+			    ));
+
+	add_option (_("Meterbridge"), new BoolOption (
+			    "show-solo-on-meterbridge",
+			    _("Solo Button"),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_solo_on_meterbridge),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_solo_on_meterbridge)
+			    ));
+
+	add_option (_("Meterbridge"), new OptionEditorHeading (_("Name Labels")));
+
+	add_option (_("Meterbridge"), new BoolOption (
+			    "show-name-on-meterbridge",
+			    _("Track Name"),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::get_show_name_on_meterbridge),
+			    sigc::mem_fun (*_session_config, &SessionConfiguration::set_show_name_on_meterbridge)
+			    ));
+
 }
 
 void
diff --git a/gtk2_ardour/sfdb_freesound_mootcher.cc b/gtk2_ardour/sfdb_freesound_mootcher.cc
index e46fb12..8e57d9a 100644
--- a/gtk2_ardour/sfdb_freesound_mootcher.cc
+++ b/gtk2_ardour/sfdb_freesound_mootcher.cc
@@ -53,6 +53,9 @@
 #include "i18n.h"
 
 #include "ardour/audio_library.h"
+#include "ardour/rc_configuration.h"
+#include "pbd/pthread_utils.h"
+#include "gui_thread.h"
 
 using namespace PBD;
 
@@ -63,9 +66,12 @@ static const std::string api_key = "9d77cb8d841b4bcfa960e1aae62224eb"; // ardour
 Mootcher::Mootcher()
 	: curl(curl_easy_init())
 {
-	std::string path;
-	path = Glib::get_home_dir() + "/Freesound/";
-	changeWorkingDir ( path.c_str() );
+	cancel_download_btn.set_label (_("Cancel"));
+	progress_hbox.pack_start (progress_bar, true, true);
+	progress_hbox.pack_end (cancel_download_btn, false, false);
+	progress_bar.show();
+	cancel_download_btn.show();
+	cancel_download_btn.signal_clicked().connect(sigc::mem_fun (*this, &Mootcher::cancelDownload));
 };
 //------------------------------------------------------------------------
 Mootcher:: ~Mootcher()
@@ -74,31 +80,25 @@ Mootcher:: ~Mootcher()
 }
 
 //------------------------------------------------------------------------
-void Mootcher::changeWorkingDir(const char *saveLocation)
-{
-	basePath = saveLocation;
-#ifdef __WIN32__
-	std::string replace = "/";
-	size_t pos = basePath.find("\\");
-	while( pos != std::string::npos ){
-		basePath.replace(pos, 1, replace);
-		pos = basePath.find("\\");
-	}
-#endif
-	//
-	size_t pos2 = basePath.find_last_of("/");
-	if(basePath.length() != (pos2+1)) basePath += "/";
-}
 
 void Mootcher::ensureWorkingDir ()
 {
-	std::string p = Glib::build_filename (basePath, "snd");
+	std::string p = ARDOUR::Config->get_freesound_download_dir();
 
 	if (!Glib::file_test (p, Glib::FILE_TEST_IS_DIR)) {
 		if (g_mkdir_with_parents (p.c_str(), 0775) != 0) {
 			PBD::error << "Unable to create Mootcher working dir" << endmsg;
 		}
 	}
+	basePath = p;
+#ifdef __WIN32__
+	std::string replace = "/";
+	size_t pos = basePath.find("\\");
+	while( pos != std::string::npos ){
+		basePath.replace(pos, 1, replace);
+		pos = basePath.find("\\");
+	}
+#endif
 }
 	
 
@@ -121,7 +121,8 @@ size_t Mootcher::WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void
 
 //------------------------------------------------------------------------
 
-std::string Mootcher::sortMethodString(enum sortMethod sort) {
+std::string Mootcher::sortMethodString(enum sortMethod sort)
+{
 // given a sort type, returns the string value to be passed to the API to
 // sort the results in the requested way.
 
@@ -202,6 +203,18 @@ std::string Mootcher::doRequest(std::string uri, std::string params)
 }
 
 
+std::string Mootcher::searchSimilar(std::string id)
+{
+	std::string params = "";
+
+	params += "&fields=id,original_filename,duration,filesize,samplerate,license,serve";
+	params += "&num_results=100";
+
+	return doRequest("/sounds/" + id + "/similar", params);
+}
+
+//------------------------------------------------------------------------
+
 std::string Mootcher::searchText(std::string query, int page, std::string filter, enum sortMethod sort)
 {
 	std::string params = "";
@@ -264,7 +277,7 @@ std::string Mootcher::getSoundResourceFile(std::string ID)
 	// get the file name and size from xml file
 	if (name) {
 
-		audioFileName = basePath + "snd/" + ID + "-" + name->child("text")->content();
+		audioFileName = Glib::build_filename (basePath, ID + "-" + name->child("text")->content());
 
 		//store all the tags in the database
 		XMLNode *tags = freesound->child("tags");
@@ -296,10 +309,61 @@ int audioFileWrite(void *buffer, size_t size, size_t nmemb, void *file)
 };
 
 //------------------------------------------------------------------------
-std::string Mootcher::getAudioFile(std::string originalFileName, std::string ID, std::string audioURL, SoundFileBrowser *caller)
+
+void *
+Mootcher::threadFunc() {
+CURLcode res;
+
+	res = curl_easy_perform (curl);
+	fclose (theFile);
+	curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 1); // turn off the progress bar
+	
+	if (res != CURLE_OK) {
+		/* it's not an error if the user pressed the stop button */
+		if (res != CURLE_ABORTED_BY_CALLBACK) {
+			error <<  string_compose (_("curl error %1 (%2)"), res, curl_easy_strerror(res)) << endmsg;
+		}
+		remove ( (audioFileName+".part").c_str() );  
+	} else {
+		rename ( (audioFileName+".part").c_str(), audioFileName.c_str() );
+		// now download the tags &c.
+		getSoundResourceFile(ID);
+	}
+
+	return (void *) res;
+}
+ 
+void
+Mootcher::doneWithMootcher()
+{
+
+	// update the sound info pane if the selection in the list box is still us 
+	sfb->refresh_display(ID, audioFileName);
+
+	delete this; // this should be OK to do as long as Progress and Finished signals are always received in the order in which they are emitted
+}
+
+static void *
+freesound_download_thread_func(void *arg) 
+{ 
+	Mootcher *thisMootcher = (Mootcher *) arg;
+	void *res;
+
+	// std::cerr << "freesound_download_thread_func(" << arg << ")" << std::endl;
+	res = thisMootcher->threadFunc();
+
+	thisMootcher->Finished(); /* EMIT SIGNAL */
+	return res;
+}
+
+
+//------------------------------------------------------------------------
+
+bool Mootcher::checkAudioFile(std::string originalFileName, std::string theID)
 {
 	ensureWorkingDir();
-	std::string audioFileName = basePath + "snd/" + ID + "-" + originalFileName;
+	ID = theID;
+	audioFileName = Glib::build_filename (basePath, ID + "-" + originalFileName);
 
 	// check to see if audio file already exists
 	FILE *testFile = g_fopen(audioFileName.c_str(), "r");
@@ -307,29 +371,31 @@ std::string Mootcher::getAudioFile(std::string originalFileName, std::string ID,
 		fseek (testFile , 0 , SEEK_END);
 		if (ftell (testFile) > 256) {
 			fclose (testFile);
-			return audioFileName;
+			return true;
 		}
 		
-		// else file was small, probably an error, delete it and try again
+		// else file was small, probably an error, delete it 
 		fclose(testFile);
 		remove( audioFileName.c_str() );  
 	}
+	return false;
+}
 
-	if (!curl) {
-		return "";
-	}
 
-	// if already cancelling a previous download, bail out here  ( this can happen b/c getAudioFile gets called by various UI update funcs )
-	if ( caller->freesound_download_cancel ) {
-		return "";
+bool Mootcher::fetchAudioFile(std::string originalFileName, std::string theID, std::string audioURL, SoundFileBrowser *caller)
+{
+	ensureWorkingDir();
+	ID = theID;
+	audioFileName = Glib::build_filename (basePath, ID + "-" + originalFileName);
+
+	if (!curl) {
+		return false;
 	}
-	
 	// now download the actual file
-	FILE* theFile;
-	theFile = g_fopen( audioFileName.c_str(), "wb" );
+	theFile = g_fopen( (audioFileName + ".part").c_str(), "wb" );
 
 	if (!theFile) {
-		return "";
+		return false;
 	}
 	
 	// create the download url
@@ -340,57 +406,59 @@ std::string Mootcher::getAudioFile(std::string originalFileName, std::string ID,
 	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, audioFileWrite);
 	curl_easy_setopt(curl, CURLOPT_WRITEDATA, theFile);
 
-	/* hack to get rid of the barber-pole stripes */
-	caller->freesound_progress_bar.hide();
-	caller->freesound_progress_bar.show();
-
 	std::string prog;
 	prog = string_compose (_("%1"), originalFileName);
-	caller->freesound_progress_bar.set_text(prog);
+	progress_bar.set_text(prog);
+
+	Gtk::VBox *freesound_vbox = dynamic_cast<Gtk::VBox *> (caller->notebook.get_nth_page(2));
+	freesound_vbox->pack_start(progress_hbox, Gtk::PACK_SHRINK);
+	progress_hbox.show();
+	cancel_download = false;
+	sfb = caller;
 
 	curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 0); // turn on the progress bar
 	curl_easy_setopt (curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
-	curl_easy_setopt (curl, CURLOPT_PROGRESSDATA, caller);
+	curl_easy_setopt (curl, CURLOPT_PROGRESSDATA, this);
 
-	CURLcode res = curl_easy_perform(curl);
-	fclose(theFile);
+	Progress.connect(*this, invalidator (*this), boost::bind(&Mootcher::updateProgress, this, _1, _2), gui_context());
+	Finished.connect(*this, invalidator (*this), boost::bind(&Mootcher::doneWithMootcher, this), gui_context());
+	pthread_t freesound_download_thread;
+	pthread_create_and_store("freesound_import", &freesound_download_thread, freesound_download_thread_func, this);
 
-	curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 1); // turn off the progress bar
-	caller->freesound_progress_bar.set_fraction(0.0);
-	caller->freesound_progress_bar.set_text("");
-	
-	if( res != 0 ) {
-		/* it's not an error if the user pressed the stop button */
-		if (res != CURLE_ABORTED_BY_CALLBACK) {
-			error <<  string_compose (_("curl error %1 (%2)"), res, curl_easy_strerror(res)) << endmsg;
+	return true;
+}
+
+//---------
+
+void 
+Mootcher::updateProgress(double dlnow, double dltotal) 
+{
+	if (dltotal > 0) {
+		double fraction = dlnow / dltotal;
+		// std::cerr << "progress idle: " << progress->bar->get_text() << ". " << progress->dlnow << " / " << progress->dltotal << " = " << fraction << std::endl;
+		if (fraction > 1.0) {
+			fraction = 1.0;
+		} else if (fraction < 0.0) {
+			fraction = 0.0;
 		}
-		remove( audioFileName.c_str() );  
-		return "";
-	} else {
-		// now download the tags &c.
-		getSoundResourceFile(ID);
+		progress_bar.set_fraction(fraction);
 	}
-
-	return audioFileName;
 }
 
-//---------
-int Mootcher::progress_callback(void *caller, double dltotal, double dlnow, double /*ultotal*/, double /*ulnow*/)
+int 
+Mootcher::progress_callback(void *caller, double dltotal, double dlnow, double /*ultotal*/, double /*ulnow*/)
 {
+	// It may seem curious to pass a pointer to an instance of an object to a static
+	// member function, but we can't use a normal member function as a curl progress callback,
+	// and we want access to some private members of Mootcher.
 
-SoundFileBrowser *sfb = (SoundFileBrowser *) caller;
-	//XXX I hope it's OK to do GTK things in this callback. Otherwise
-	// I'll have to do stuff like in interthread_progress_window.
-	if (sfb->freesound_download_cancel) {
-		return -1;
-	}
-	
+	Mootcher *thisMootcher = (Mootcher *) caller;
 	
-	sfb->freesound_progress_bar.set_fraction(dlnow/dltotal);
-	/* Make sure the progress widget gets updated */
-	while (Glib::MainContext::get_default()->iteration (false)) {
-		/* do nothing */
+	if (thisMootcher->cancel_download) {
+		return -1;
 	}
+
+	thisMootcher->Progress(dlnow, dltotal); /* EMIT SIGNAL */
 	return 0;
 }
 
diff --git a/gtk2_ardour/sfdb_freesound_mootcher.h b/gtk2_ardour/sfdb_freesound_mootcher.h
index 7e39ba4..48fb11b 100644
--- a/gtk2_ardour/sfdb_freesound_mootcher.h
+++ b/gtk2_ardour/sfdb_freesound_mootcher.h
@@ -65,18 +65,31 @@ enum sortMethod {
 };
 
 
-class Mootcher
+class Mootcher: public sigc::trackable, public PBD::ScopedConnectionList
 {
 public:
 	Mootcher();
 	~Mootcher();
 
-	std::string	getAudioFile(std::string originalFileName, std::string ID, std::string audioURL, SoundFileBrowser *caller);
+	bool		checkAudioFile(std::string originalFileName, std::string ID);
+	bool		fetchAudioFile(std::string originalFileName, std::string ID, std::string audioURL, SoundFileBrowser *caller);
 	std::string	searchText(std::string query, int page, std::string filter, enum sortMethod sort);
+	std::string	searchSimilar(std::string id);
+	void *		threadFunc();
+	SoundFileBrowser *sfb; 
+	std::string	audioFileName;
+	std::string	ID;
+
+	/** signal emitted when mootcher reports progress updates during download.
+	 * The parameters are current and total numbers of bytes downloaded.
+	 */
+	PBD::Signal2<void, double, double> Progress;
+	/** signal emitted when the mootcher has finished downloading. */
+	PBD::Signal0<void> Finished;
+
 
 private:
 
-	void		changeWorkingDir(const char *saveLocation);
 	void		ensureWorkingDir();
 
 	std::string	doRequest(std::string uri, std::string params);
@@ -90,6 +103,21 @@ private:
 	CURL *curl;
 	char errorBuffer[CURL_ERROR_SIZE];	// storage for cUrl error message
 
+	FILE* theFile;
+
+	void updateProgress(double dlnow, double dltotal);
+	void doneWithMootcher();
+
+	Gtk::HBox progress_hbox;
+	Gtk::ProgressBar progress_bar;
+	Gtk::Button cancel_download_btn;
+
+	bool cancel_download;
+	void cancelDownload() { 
+		cancel_download = true;
+		progress_hbox.hide();
+	}
+
 	std::string basePath;
 	std::string xmlLocation;
 };
diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc
index 85b4f7d..986ed7f 100644
--- a/gtk2_ardour/sfdb_ui.cc
+++ b/gtk2_ardour/sfdb_ui.cc
@@ -80,6 +80,7 @@ using namespace Editing;
 using std::string;
 
 string SoundFileBrowser::persistent_folder;
+typedef TreeView::Selection::ListHandle_Path ListPath;
 
 static ImportMode
 string2importmode (string str)
@@ -341,7 +342,8 @@ SoundFileBox::audition ()
 		try {
 			afs = boost::dynamic_pointer_cast<AudioFileSource> (
 				SourceFactory::createExternal (DataType::AUDIO, *_session,
-							       path, n, Source::Flag (0), false));
+							       path, n,
+							       Source::Flag (0), false));
 			
 			srclist.push_back(afs);
 
@@ -512,8 +514,6 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
 	found_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked));
 	found_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked));
 	
-	freesound_stop_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_stop_clicked));
-	
 	notebook.append_page (*vbox, _("Search Tags"));
 
 #ifdef FREESOUND
@@ -555,9 +555,9 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
 	freesound_more_btn.set_label(_("More"));
 	freesound_more_btn.set_sensitive(false);
 
-	passbox->pack_end   (freesound_stop_btn, false, false);
-	freesound_stop_btn.set_label(_("Stop"));
-	freesound_stop_btn.set_sensitive(false);
+	passbox->pack_start (freesound_similar_btn, false, false);
+	freesound_similar_btn.set_label(_("Similar"));
+	freesound_similar_btn.set_sensitive(false);
 	
 	scroll = manage(new ScrolledWindow);
 	scroll->add(freesound_list_view);
@@ -566,9 +566,8 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
 	vbox = manage(new VBox);
 	vbox->set_spacing (3);
 	vbox->pack_start (*passbox, PACK_SHRINK);
-	vbox->pack_start (freesound_progress_bar, PACK_SHRINK);
 	vbox->pack_start (*scroll);
-	
+
 	freesound_list_view.append_column(_("ID")      , freesound_list_columns.id);
 	freesound_list_view.append_column(_("Filename"), freesound_list_columns.filename);
 	// freesound_list_view.append_column(_("URI")     , freesound_list_columns.uri);
@@ -577,20 +576,22 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
 	freesound_list_view.append_column(_("Samplerate"), freesound_list_columns.smplrate);
 	freesound_list_view.append_column(_("License"), freesound_list_columns.license);
 	freesound_list_view.get_column(0)->set_alignment(0.5);
-	freesound_list_view.get_column(1)->set_expand(true);
+	freesound_list_view.get_column(1)->set_expand(true); // filename
+	freesound_list_view.get_column(1)->set_resizable(true); // filename
 	freesound_list_view.get_column(2)->set_alignment(0.5);
 	freesound_list_view.get_column(3)->set_alignment(0.5);
 	freesound_list_view.get_column(4)->set_alignment(0.5);
 	freesound_list_view.get_column(5)->set_alignment(0.5);
 	
 	freesound_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_list_view_selected));
+	freesound_list_view.set_tooltip_column(1);
 
 	freesound_list_view.get_selection()->set_mode (SELECTION_MULTIPLE);
 	freesound_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::freesound_list_view_activated));
 	freesound_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_search_clicked));
 	freesound_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_search_clicked));
 	freesound_more_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_more_clicked));
-	freesound_stop_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_stop_clicked));
+	freesound_similar_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_similar_clicked));
 	notebook.append_page (*vbox, _("Search Freesound"));
 #endif
 
@@ -787,7 +788,7 @@ SoundFileBrowser::found_list_view_selected ()
 	} else {
 		string file;
 
-		TreeView::Selection::ListHandle_Path rows = found_list_view.get_selection()->get_selected_rows ();
+		ListPath rows = found_list_view.get_selection()->get_selected_rows ();
 
 		if (!rows.empty()) {
 			TreeIter iter = found_list->get_iter(*rows.begin());
@@ -803,55 +804,6 @@ SoundFileBrowser::found_list_view_selected ()
 }
 
 void
-SoundFileBrowser::freesound_list_view_selected ()
-{
-	freesound_download_cancel = false;
-	freesound_stop_btn.set_sensitive(true);
-
-#ifdef FREESOUND
-	if (!reset_options ()) {
-		set_action_sensitive (false);
-	} else {
-		Mootcher mootcher; 
-		string file;
-
-		TreeView::Selection::ListHandle_Path rows = freesound_list_view.get_selection()->get_selected_rows ();
-
-		if (!rows.empty()) {
-			TreeIter iter = freesound_list->get_iter(*rows.begin());
-
-			string id  = (*iter)[freesound_list_columns.id];
-			string uri = (*iter)[freesound_list_columns.uri];
-			string ofn = (*iter)[freesound_list_columns.filename];
-
-			// download the sound file			
-			GdkCursor *prev_cursor;
-			prev_cursor = gdk_window_get_cursor (get_window()->gobj());
-			gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH));
-			gdk_flush();
-
-			file = mootcher.getAudioFile(ofn, id, uri, this);
-
-			gdk_window_set_cursor (get_window()->gobj(), prev_cursor);
-
-			if (file != "") {
-				chooser.set_filename (file);
-				set_action_sensitive (true);
-			}
-		} else {
-			set_action_sensitive (false);
-		}
-
-		freesound_progress_bar.set_text(
-			string_compose(P_("found %1 match", "found %1 matches", matches), matches));
-
-		preview.setup_labels (file);
-	}
-#endif
-	freesound_stop_btn.set_sensitive(false);
-}
-
-void
 SoundFileBrowser::found_search_clicked ()
 {
 	string tag_string = found_entry.get_text ();
@@ -875,6 +827,91 @@ SoundFileBrowser::found_search_clicked ()
 	}
 }
 
+
+std::string
+SoundFileBrowser::freesound_get_audio_file(Gtk::TreeIter iter)
+{
+
+	Mootcher *mootcher = new Mootcher;
+	std::string file;
+
+	string id  = (*iter)[freesound_list_columns.id];
+	string uri = (*iter)[freesound_list_columns.uri];
+	string ofn = (*iter)[freesound_list_columns.filename];
+
+	if (mootcher->checkAudioFile(ofn, id)) {
+		// file already exists, no need to download it again
+		file = mootcher->audioFileName;
+		delete mootcher;
+		(*iter)[freesound_list_columns.started] = false;
+		return file;
+	}
+	if (!(*iter)[freesound_list_columns.started]) {
+		// start downloading the sound file
+		(*iter)[freesound_list_columns.started] = true;
+		mootcher->fetchAudioFile(ofn, id, uri, this);
+	}
+	return "";
+}
+
+void
+SoundFileBrowser::freesound_list_view_selected ()
+{
+
+	if (!reset_options ()) {
+		set_action_sensitive (false);
+	} else {
+		std::string file;
+		ListPath rows = freesound_list_view.get_selection()->get_selected_rows ();
+		for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) {
+			file = freesound_get_audio_file (freesound_list->get_iter(*i));
+		}
+
+		switch (rows.size()) {
+			case 0:
+				// nothing selected
+				freesound_similar_btn.set_sensitive(false);
+				set_action_sensitive (false);
+				break;
+			case 1:
+				// exactly one item selected
+				if (file != "") {
+					// file exists on disk already
+					chooser.set_filename (file);
+					preview.setup_labels (file);
+					set_action_sensitive (true);
+				}
+				freesound_similar_btn.set_sensitive(true);
+				break;
+			default:
+				// multiple items selected
+				preview.setup_labels ("");
+				freesound_similar_btn.set_sensitive(false);
+				break;
+		}
+
+	}
+}
+
+void
+SoundFileBrowser::refresh_display(std::string ID, std::string file)
+{
+	// called when the mootcher has finished downloading a file
+	ListPath rows = freesound_list_view.get_selection()->get_selected_rows ();
+	if (rows.size() == 1) {
+		// there's a single item selected in the freesound list
+		//XXX make a function to be used to construct the actual file name both here and in the mootcher
+		Gtk::TreeIter row = freesound_list->get_iter(*rows.begin());
+		std::string selected_ID = (*row)[freesound_list_columns.id]; 
+		if (ID == selected_ID) {
+			// the selected item in the freesound list is the item that has just finished downloading
+			chooser.set_filename(file);
+			preview.setup_labels (file);
+			set_action_sensitive (true);
+		}
+	}
+}
+
 void
 SoundFileBrowser::freesound_search_clicked ()
 {
@@ -895,18 +932,32 @@ SoundFileBrowser::freesound_more_clicked ()
 }
 
 void
-SoundFileBrowser::freesound_stop_clicked ()
+SoundFileBrowser::freesound_similar_clicked ()
 {
-	freesound_download_cancel = true;
+	ListPath rows = freesound_list_view.get_selection()->get_selected_rows ();
+	if (rows.size() == 1) {
+		Mootcher mootcher;
+		string id;
+		Gtk::TreeIter iter = freesound_list->get_iter(*rows.begin());
+		id = (*iter)[freesound_list_columns.id];
+		freesound_list->clear();
+
+		GdkCursor *prev_cursor;
+		prev_cursor = gdk_window_get_cursor (get_window()->gobj());
+		gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH));
+		gdk_flush();
+		
+		std::string theString = mootcher.searchSimilar(id);
+		
+		gdk_window_set_cursor (get_window()->gobj(), prev_cursor);
+		handle_freesound_results(theString);
+	}
 }
 
-
 void
 SoundFileBrowser::freesound_search()
 {
-#ifdef FREESOUND
 	Mootcher mootcher;
-	freesound_list_view.get_column(1)->set_sizing(TREE_VIEW_COLUMN_GROW_ONLY);
 
 	string search_string = freesound_entry.get_text ();
 	enum sortMethod sort_method = (enum sortMethod) freesound_sort.get_active_row_number();
@@ -914,7 +965,6 @@ SoundFileBrowser::freesound_search()
 	GdkCursor *prev_cursor;
 	prev_cursor = gdk_window_get_cursor (get_window()->gobj());
 	gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH));
-	freesound_progress_bar.set_fraction(0.0);
 	gdk_flush();
 
 	std::string theString = mootcher.searchText(
@@ -929,7 +979,11 @@ SoundFileBrowser::freesound_search()
 			);
 
 	gdk_window_set_cursor (get_window()->gobj(), prev_cursor);
+	handle_freesound_results(theString);
+}
 
+void
+SoundFileBrowser::handle_freesound_results(std::string theString) {
 	XMLTree doc;
 	doc.read_buffer( theString );
 	XMLNode *root = doc.root();
@@ -1065,14 +1119,6 @@ SoundFileBrowser::freesound_search()
 			matches++;
 		}
 	}
-
-	if (matches == 0) {
-		freesound_progress_bar.set_text(_("Search returned no results."));
-	} else {
-		freesound_progress_bar.set_text(string_compose(P_("Found %1 match", "Found %1 matches", matches), matches));
-	}
-	freesound_list_view.get_column(1)->set_sizing(TREE_VIEW_COLUMN_AUTOSIZE);
-#endif
 }
 
 vector<string>
@@ -1093,9 +1139,7 @@ SoundFileBrowser::get_paths ()
 			}
 		}
 
-	} else if (n==1){
-
-		typedef TreeView::Selection::ListHandle_Path ListPath;
+	} else if (n == 1) {
 
 		ListPath rows = found_list_view.get_selection()->get_selected_rows ();
 		for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) {
@@ -1106,28 +1150,12 @@ SoundFileBrowser::get_paths ()
 		}
 	} else {
 #ifdef FREESOUND
-		typedef TreeView::Selection::ListHandle_Path ListPath;
-		Mootcher mootcher;
-
 		ListPath rows = freesound_list_view.get_selection()->get_selected_rows ();
 		for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) {
-			TreeIter iter = freesound_list->get_iter(*i);
-			string id  = (*iter)[freesound_list_columns.id];
-			string uri = (*iter)[freesound_list_columns.uri];
-			string ofn = (*iter)[freesound_list_columns.filename];
-
-			GdkCursor *prev_cursor;
-			prev_cursor = gdk_window_get_cursor (get_window()->gobj());
-			gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH));
-			gdk_flush();
-
-			string str = mootcher.getAudioFile(ofn, id, uri, this);
+			string str = freesound_get_audio_file (freesound_list->get_iter(*i));
 			if (str != "") {
 				results.push_back (str);
 			}
-			
-			gdk_window_set_cursor (get_window()->gobj(), prev_cursor);
-
 		}
 #endif
 	}
diff --git a/gtk2_ardour/sfdb_ui.h b/gtk2_ardour/sfdb_ui.h
index bed800a..5d8decd 100644
--- a/gtk2_ardour/sfdb_ui.h
+++ b/gtk2_ardour/sfdb_ui.h
@@ -131,6 +131,7 @@ class SoundFileBrowser : public ArdourWindow
 		Gtk::TreeModelColumn<std::string> filesize;
 		Gtk::TreeModelColumn<std::string> smplrate;
 		Gtk::TreeModelColumn<std::string> license;
+		Gtk::TreeModelColumn<bool>        started;
 
 		FreesoundColumns() {
 			add(id); 
@@ -140,6 +141,7 @@ class SoundFileBrowser : public ArdourWindow
 			add(filesize);
 			add(smplrate);
 			add(license);
+			add(started);
 		}
 	};
 
@@ -150,8 +152,9 @@ class SoundFileBrowser : public ArdourWindow
 	Glib::RefPtr<Gtk::ListStore> freesound_list;
 
 	Gtk::Button freesound_more_btn;
-	Gtk::Button freesound_stop_btn;
+	Gtk::Button freesound_similar_btn;
 
+	void handle_freesound_results(std::string theString);
   public:
 	SoundFileBrowser (std::string title, ARDOUR::Session* _s, bool persistent);
 	virtual ~SoundFileBrowser ();
@@ -177,11 +180,10 @@ class SoundFileBrowser : public ArdourWindow
 
 	Gtk::Button freesound_search_btn;
 	Gtk::TreeView freesound_list_view;
-	Gtk::ProgressBar freesound_progress_bar;
-
-	bool freesound_download_cancel;
+	Gtk::Notebook notebook;
 
 	void freesound_search();
+	void refresh_display(std::string ID, std::string file);
 	
   protected:
 	bool resetting_ourselves;
@@ -203,7 +205,6 @@ class SoundFileBrowser : public ArdourWindow
 
 	static std::string persistent_folder;
 
-	Gtk::Notebook notebook;
 
 	GainMeter* gm;
 	Gtk::VBox meter_packer;
@@ -224,10 +225,11 @@ class SoundFileBrowser : public ArdourWindow
 	void freesound_list_view_activated (const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn*);
 	void freesound_search_clicked ();
 	void freesound_more_clicked ();
-	void freesound_stop_clicked ();
+	void freesound_similar_clicked ();
 	int freesound_page;
 	
 	void chooser_file_activated ();
+	std::string freesound_get_audio_file(Gtk::TreeIter iter);
 
 	bool on_audio_filter (const Gtk::FileFilter::Info& filter_info);
 	bool on_midi_filter (const Gtk::FileFilter::Info& filter_info);
diff --git a/gtk2_ardour/splash.cc b/gtk2_ardour/splash.cc
index 99adff6..b606ec6 100644
--- a/gtk2_ardour/splash.cc
+++ b/gtk2_ardour/splash.cc
@@ -236,7 +236,7 @@ Splash::message (const string& msg)
 		}
 
                 while (!expose_done) {
-                        gtk_main_iteration ();
+                        if(gtk_main_iteration ()) return; // quit was called
                 }
 		gdk_display_flush (gdk_display_get_default());
 	}
diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc
index 6f0b1cf..e24e7d6 100644
--- a/gtk2_ardour/startup.cc
+++ b/gtk2_ardour/startup.cc
@@ -189,33 +189,33 @@ ArdourStartup::ready_without_display () const
 void
 ArdourStartup::setup_prerelease_page ()
 {
-        VBox* vbox = manage (new VBox);
-        Label* label = manage (new Label);
-        label->set_markup (_("<b>Welcome to this BETA release of Ardour 3.0</b>\n\n\
-Ardour 3.0 has been released for Linux but because of the lack of testers,\n\
+	VBox* vbox = manage (new VBox);
+	Label* label = manage (new Label);
+	label->set_markup (string_compose (_("<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\
-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 3.0-beta.\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 ardour3. You\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\
-"));
-
-        vbox->set_border_width (12);
-        vbox->pack_start (*label, false, false, 12);
-        vbox->show_all ();
+"), VERSIONSTRING));
 
-        append_page (*vbox);
-        set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
-        set_page_title (*vbox, _("This is a BETA RELEASE"));
+	vbox->set_border_width (12);
+	vbox->pack_start (*label, false, false, 12);
+	vbox->show_all ();
+	
+	append_page (*vbox);
+	set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
+	set_page_title (*vbox, _("This is a BETA RELEASE"));
 	set_page_complete (*vbox, true);
 }
 
@@ -591,7 +591,7 @@ ArdourStartup::setup_initial_choice_page ()
 	ic_vbox.show_all ();
 
 	initial_choice_index = append_page (ic_vbox);
-	set_page_title (ic_vbox, _("What would you like to do ?"));
+	set_page_title (ic_vbox, string_compose("%1 %2", PROGRAM_NAME, VERSIONSTRING));
 	set_page_header_image (ic_vbox, icon_pixbuf);
 
 	/* user could just click on "Forward" if default
@@ -805,7 +805,15 @@ ArdourStartup::setup_new_session_page ()
 			string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR);
 			session_parent_dir = session_parent_dir.substr(0, last_dir_sep);
 			new_folder_chooser.set_current_folder (session_parent_dir);
-			new_folder_chooser.add_shortcut_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
+			string default_session_folder = poor_mans_glob (Config->get_default_session_parent_dir());
+
+			try {
+				/* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
+				new_folder_chooser.add_shortcut_folder (default_session_folder);
+			}
+			catch (Glib::Error & e) {
+				std::cerr << "new_folder_chooser.add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl;
+			}
 		} else {
 			new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
 		}
@@ -917,6 +925,7 @@ ArdourStartup::setup_new_session_page ()
 	if (more_new_session_options_button.get_active()) {
 		set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT);
 	}
+	session_hbox.show_all();
 }
 
 void
@@ -1092,6 +1101,7 @@ ArdourStartup::setup_existing_session_page ()
 
 	set_page_title (session_vbox, _("Select a session"));
 	set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
+	session_hbox.show_all();
 }
 
 void
diff --git a/gtk2_ardour/step_editor.cc b/gtk2_ardour/step_editor.cc
index a75f0f9..11ac6c3 100644
--- a/gtk2_ardour/step_editor.cc
+++ b/gtk2_ardour/step_editor.cc
@@ -149,7 +149,7 @@ bool
 StepEditor::step_editor_hidden (GdkEventAny*)
 {
         step_editor_hide ();
-        return true;
+        return true; // XXX remember position ?!
 }
 
 void
diff --git a/gtk2_ardour/system_exec.cc b/gtk2_ardour/system_exec.cc
index 55dbc60..59f3647 100644
--- a/gtk2_ardour/system_exec.cc
+++ b/gtk2_ardour/system_exec.cc
@@ -724,10 +724,8 @@ SystemExec::start (int stderr_mode)
 	signal(SIGPIPE, SIG_DFL);
 #endif
 
-#ifndef __WIN32__
-	int good_fds[1] = { 0 };
+	int good_fds[1] = { -1 };
 	close_allv(good_fds);
-#endif
 
 	::execve(argp[0], argp, envp);
 	/* if we reach here something went wrong.. */
diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc
index 8d2276b..2cc2adf 100644
--- a/gtk2_ardour/time_axis_view.cc
+++ b/gtk2_ardour/time_axis_view.cc
@@ -134,12 +134,18 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
 	controls_table.set_no_show_all ();
 
 	HSeparator* separator = manage (new HSeparator());
+	separator->set_name("TrackSeparator");
+	separator->set_size_request(-1, 1);
+	separator->show();
 
 	controls_vbox.pack_start (controls_table, false, false);
 	controls_vbox.show ();
 
+	controls_hbox.pack_start (controls_vbox, true, true);
+	controls_hbox.show ();
+
 	//controls_ebox.set_name ("TimeAxisViewControlsBaseUnselected");
-	controls_ebox.add (controls_vbox);
+	controls_ebox.add (controls_hbox);
 	controls_ebox.add_events (Gdk::BUTTON_PRESS_MASK|
 				  Gdk::BUTTON_RELEASE_MASK|
 				  Gdk::POINTER_MOTION_MASK|
@@ -156,10 +162,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
 	controls_ebox.signal_leave_notify_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_leave));
 	controls_ebox.show ();
 
-	controls_hbox.pack_start (controls_ebox, true, true);
-	controls_hbox.show ();
-
-	time_axis_vbox.pack_start (controls_hbox, true, true);
+	time_axis_vbox.pack_start (controls_ebox, true, true, 0);
 	time_axis_vbox.pack_end (*separator, false, false);
 	time_axis_vbox.show();
 
@@ -310,7 +313,7 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
 {
 	switch (ev->direction) {
 	case GDK_SCROLL_UP:
-		if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
+		if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
 			/* See Editor::_stepping_axis_view for notes on this hack */
 			Editor& e = dynamic_cast<Editor&> (_editor);
 			if (!e.stepping_axis_view ()) {
@@ -325,7 +328,7 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
 		break;
 
 	case GDK_SCROLL_DOWN:
-		if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
+		if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
 			/* See Editor::_stepping_axis_view for notes on this hack */
 			Editor& e = dynamic_cast<Editor&> (_editor);
 			if (!e.stepping_axis_view ()) {
@@ -407,6 +410,7 @@ TimeAxisView::controls_ebox_motion (GdkEventMotion* ev)
 		maybe_set_cursor (ev->y);
 	}
 
+	gdk_event_request_motions(ev);
 	return true;
 }
 
diff --git a/gtk2_ardour/track_selection.cc b/gtk2_ardour/track_selection.cc
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/track_view_list.cc b/gtk2_ardour/track_view_list.cc
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/track_view_list.h b/gtk2_ardour/track_view_list.h
old mode 100755
new mode 100644
diff --git a/gtk2_ardour/transcode_ffmpeg.cc b/gtk2_ardour/transcode_ffmpeg.cc
index 6e8bd07..ea75310 100644
--- a/gtk2_ardour/transcode_ffmpeg.cc
+++ b/gtk2_ardour/transcode_ffmpeg.cc
@@ -33,6 +33,7 @@
 #include "i18n.h"
 
 using namespace PBD;
+using namespace VideoUtils;
 
 TranscodeFfmpeg::TranscodeFfmpeg (std::string f)
 	: infile(f)
@@ -67,18 +68,19 @@ TranscodeFfmpeg::TranscodeFfmpeg (std::string f)
 	}
 
 	if (ffmpeg_exe.empty() || ffprobe_exe.empty()) {
-		warning << _(
+		warning << string_compose(
+				_(
 				"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"
-				"Ardour requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+				"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
 				"\n"
-				"The tools are included with the Ardour releases from ardour.org "
+				"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"
-				) << endmsg;
+				), PROGRAM_NAME) << endmsg;
 		return;
 	}
 	ffexecok = true;
@@ -211,7 +213,7 @@ TranscodeFfmpeg::probe ()
 				}
 
 			} else if (i->at(5) == X_("codec_type=audio")) { /* new ffprobe */
-				AudioStream as;
+				FFAudioStream as;
 				for (std::vector<std::string>::iterator kv = i->begin(); kv != i->end(); ++kv) {
 					const size_t kvsep = kv->find('=');
 					if(kvsep == std::string::npos) continue;
@@ -261,10 +263,10 @@ TranscodeFfmpeg::probe ()
 	return true;
 }
 
-FFSettings
+TranscodeFfmpeg::FFSettings
 TranscodeFfmpeg::default_encoder_settings ()
 {
-	FFSettings ffs;
+	TranscodeFfmpeg::FFSettings ffs;
 	ffs.clear();
 	ffs["-vcodec"] = "mpeg4";
 	ffs["-acodec"] = "ac3";
@@ -273,10 +275,10 @@ TranscodeFfmpeg::default_encoder_settings ()
 	return ffs;
 }
 
-FFSettings
+TranscodeFfmpeg::FFSettings
 TranscodeFfmpeg::default_meta_data ()
 {
-	FFSettings ffm;
+	TranscodeFfmpeg::FFSettings ffm;
 	ffm.clear();
 	ffm["comment"] = "Created with ardour";
 	return ffm;
@@ -308,7 +310,7 @@ TranscodeFfmpeg::format_metadata (std::string key, std::string value)
 }
 
 bool
-TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf_v, FFSettings ffs, FFSettings meta, bool map)
+TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf_v, TranscodeFfmpeg::FFSettings ffs, TranscodeFfmpeg::FFSettings meta, bool map)
 {
 #define MAX_FFMPEG_ENCODER_ARGS (100)
 	char **argp;
@@ -327,11 +329,11 @@ TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf
 	argp[a++] = strdup("-i");
 	argp[a++] = strdup(inf_a.c_str());
 
-	for(FFSettings::const_iterator it = ffs.begin(); it != ffs.end(); ++it) {
+	for(TranscodeFfmpeg::FFSettings::const_iterator it = ffs.begin(); it != ffs.end(); ++it) {
 		argp[a++] = strdup(it->first.c_str());
 		argp[a++] = strdup(it->second.c_str());
 	}
-	for(FFSettings::const_iterator it = meta.begin(); it != meta.end(); ++it) {
+	for(TranscodeFfmpeg::FFSettings::const_iterator it = meta.begin(); it != meta.end(); ++it) {
 		argp[a++] = strdup("-metadata");
 		argp[a++] = format_metadata(it->first.c_str(), it->second.c_str());
 	}
@@ -391,7 +393,7 @@ TranscodeFfmpeg::encode (std::string outfile, std::string inf_a, std::string inf
 }
 
 bool
-TranscodeFfmpeg::extract_audio (std::string outfile, ARDOUR::framecnt_t samplerate, unsigned int stream)
+TranscodeFfmpeg::extract_audio (std::string outfile, ARDOUR::framecnt_t /*samplerate*/, unsigned int stream)
 {
 	if (!probeok) return false;
   if (stream >= m_audio.size()) return false;
@@ -471,7 +473,7 @@ TranscodeFfmpeg::transcode (std::string outfile, const int outw, const int outh,
 	argp[6] = (char*) calloc(10,sizeof(char)); snprintf(argp[6], 10, "%ix%i", width, height);
 	argp[7] = strdup("-y");
 	argp[8] = strdup("-vcodec");
-	argp[9] = strdup("mpeg4");
+	argp[9] = strdup("mjpeg");
 	argp[10] = strdup("-an");
 	argp[11] = strdup("-intra");
 	argp[12] = strdup("-g");
diff --git a/gtk2_ardour/transcode_ffmpeg.h b/gtk2_ardour/transcode_ffmpeg.h
index 932bfe0..61267ac 100644
--- a/gtk2_ardour/transcode_ffmpeg.h
+++ b/gtk2_ardour/transcode_ffmpeg.h
@@ -24,14 +24,6 @@
 #include "ardour/types.h"
 #include "system_exec.h"
 
-/* TODO: use a namespace here ? */
-struct AudioStream {
-	std::string name;
-	std::string stream_id;
-	uint32_t channels;
-};
-typedef std::vector<AudioStream> AudioStreams;
-typedef std::map<std::string,std::string> FFSettings;
 
 /** @class TranscodeFfmpeg
  *  @brief wrapper around ffmpeg and ffprobe command-line utils
@@ -46,6 +38,15 @@ class TranscodeFfmpeg : public sigc::trackable
 {
 	public:
 
+	struct FFAudioStream {
+		std::string name;
+		std::string stream_id;
+		uint32_t channels;
+	};
+	typedef std::vector<FFAudioStream> FFAudioStreams;
+	typedef std::map<std::string,std::string> FFSettings;
+
+
 		/** instantiate a new transcoder. If a file-name is given, the file's
 		 * attributes (fps, duration, geometry etc) are read.
 		 *
@@ -110,7 +111,7 @@ class TranscodeFfmpeg : public sigc::trackable
 		ARDOUR::framecnt_t get_duration() { return m_duration; }
 		std::string  get_codec() { return m_codec; }
 
-		AudioStreams get_audio() { return m_audio; }
+		FFAudioStreams get_audio() { return m_audio; }
 
 		/** override file duration used with the \ref Progress signal.
 		 * @param d duration in video-frames = length_in_seconds * get_fps()
@@ -145,7 +146,7 @@ class TranscodeFfmpeg : public sigc::trackable
 		bool ffexecok;
 		bool probeok;
 
-		AudioStreams m_audio;
+		FFAudioStreams m_audio;
 
 		char *format_metadata (std::string, std::string);
 		void ffmpegparse_v (std::string d, size_t s);
diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc
index fa5d447..3be2450 100644
--- a/gtk2_ardour/transcode_video_dialog.cc
+++ b/gtk2_ardour/transcode_video_dialog.cc
@@ -50,6 +50,7 @@ using namespace Gtk;
 using namespace std;
 using namespace PBD;
 using namespace ARDOUR;
+using namespace VideoUtils;
 
 TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile)
 	: ArdourDialog (_("Transcode/Import Video File "))
@@ -66,7 +67,7 @@ TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile)
 	, bitrate_adjustment (2000, 500, 10000, 10, 100, 0)
 	, bitrate_spinner (bitrate_adjustment)
 #if 1 /* tentative debug mode */
-	, debug_checkbox (_("Debug Mode: Print ffmpeg Command and Output to stdout."))
+	, debug_checkbox (_("Debug Mode: Print ffmpeg command and output to stdout."))
 #endif
 {
 	set_session (s);
@@ -88,7 +89,7 @@ TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile)
 
 	int w = 0, h = 0;
 	m_aspect = 4.0/3.0;
-	AudioStreams as; as.clear();
+	TranscodeFfmpeg::FFAudioStreams as; as.clear();
 
 	path_hbox->pack_start (path_label, false, false, 3);
 	path_hbox->pack_start (path_entry, true, true, 3);
@@ -227,7 +228,7 @@ TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile)
 	t->attach (audio_combo, 1, 4, 2, 3);
 	audio_combo.append_text("No audio");
 	if (as.size() > 0) {
-		for (AudioStreams::iterator it = as.begin(); it < as.end(); ++it) {
+		for (TranscodeFfmpeg::FFAudioStreams::iterator it = as.begin(); it < as.end(); ++it) {
 			audio_combo.append_text((*it).name);
 		}
 	}
diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc
index d4bc460..97368a7 100644
--- a/gtk2_ardour/utils.cc
+++ b/gtk2_ardour/utils.cc
@@ -302,6 +302,53 @@ rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a, s
 }
 
 bool
+rgba_p_from_style (string style, float *r, float *g, float *b, string attr, int state)
+{
+	static Gtk::Window* window = 0;
+	assert (r && g && b);
+
+	if (window == 0) {
+		window = new Window (WINDOW_TOPLEVEL);
+	}
+
+	Gtk::EventBox foo;
+
+	window->add (foo);
+
+	foo.set_name (style);
+	foo.ensure_style ();
+
+	GtkRcStyle* rc = foo.get_style()->gobj()->rc_style;
+
+	if (!rc) {
+		warning << string_compose (_("missing RGBA style for \"%1\""), style) << endl;
+		return false;
+	}
+	if (attr == "fg") {
+		*r = rc->fg[state].red / 65535.0;
+		*g = rc->fg[state].green / 65535.0;
+		*b = rc->fg[state].blue / 65535.0;
+	} else if (attr == "bg") {
+		*r = rc->bg[state].red / 65535.0;
+		*g = rc->bg[state].green / 65535.0;
+		*b = rc->bg[state].blue / 65535.0;
+	} else if (attr == "base") {
+		*r = rc->base[state].red / 65535.0;
+		*g = rc->base[state].green / 65535.0;
+		*b = rc->base[state].blue / 65535.0;
+	} else if (attr == "text") {
+		*r = rc->text[state].red / 65535.0;
+		*g = rc->text[state].green / 65535.0;
+		*b = rc->text[state].blue / 65535.0;
+	} else {
+		return false;
+	}
+
+	window->remove ();
+	return true;
+}
+
+bool
 canvas_item_visible (ArdourCanvas::Item* item)
 {
 	return (item->gobj()->object.flags & GNOME_CANVAS_ITEM_VISIBLE) ? true : false;
@@ -348,7 +395,7 @@ emulate_key_event (Gtk::Widget* w, unsigned int keyval)
 	ev.state = 0;
 	ev.keyval = keyval;
 	ev.length = 0;
-	ev.string = (gchar*) "";
+	ev.string = "";
 	ev.hardware_keycode = keymapkey[0].keycode;
 	ev.group = keymapkey[0].group;
 	g_free(keymapkey);
diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h
index d311010..5d7bf00 100644
--- a/gtk2_ardour/utils.h
+++ b/gtk2_ardour/utils.h
@@ -56,6 +56,8 @@ Pango::FontDescription get_font_for_style (std::string widgetname);
 
 uint32_t rgba_from_style (std::string, uint32_t, uint32_t, uint32_t, uint32_t, std::string = "fg", int = Gtk::STATE_NORMAL, bool = true);
 
+bool rgba_p_from_style (std::string, float*, float*, float*, std::string = "fg", int = Gtk::STATE_NORMAL);
+
 void decorate (Gtk::Window& w, Gdk::WMDecoration d);
 
 bool canvas_item_visible (ArdourCanvas::Item* item);
diff --git a/gtk2_ardour/utils_videotl.cc b/gtk2_ardour/utils_videotl.cc
index b90abf7..ed1bfad 100644
--- a/gtk2_ardour/utils_videotl.cc
+++ b/gtk2_ardour/utils_videotl.cc
@@ -35,9 +35,10 @@ using namespace Gtk;
 using namespace std;
 using namespace PBD;
 using namespace ARDOUR;
+using namespace VideoUtils;
 
 bool
-confirm_video_outfn (std::string outfn, std::string docroot)
+VideoUtils::confirm_video_outfn (std::string outfn, std::string docroot)
 {
 	/* replace docroot's '/' to G_DIR_SEPARATOR for the comparison */
 	size_t look_here = 0;
@@ -77,7 +78,7 @@ confirm_video_outfn (std::string outfn, std::string docroot)
 }
 
 std::string
-video_dest_dir (const std::string sessiondir, const std::string docroot)
+VideoUtils::video_dest_dir (const std::string sessiondir, const std::string docroot)
 {
 	std::string dir = docroot;
 	if (dir.empty() || !dir.compare(0, dir.length(), sessiondir, 0, dir.length())) {
@@ -92,7 +93,7 @@ video_dest_dir (const std::string sessiondir, const std::string docroot)
 }
 
 std::string
-video_get_docroot (ARDOUR::RCConfiguration* config)
+VideoUtils::video_get_docroot (ARDOUR::RCConfiguration* config)
 {
 	if (config->get_video_advanced_setup()) {
 		return config->get_video_server_docroot();
@@ -101,7 +102,7 @@ video_get_docroot (ARDOUR::RCConfiguration* config)
 }
 
 std::string
-video_get_server_url (ARDOUR::RCConfiguration* config)
+VideoUtils::video_get_server_url (ARDOUR::RCConfiguration* config)
 {
 	if (config->get_video_advanced_setup()) {
 		return config->get_video_server_url();
@@ -111,7 +112,7 @@ video_get_server_url (ARDOUR::RCConfiguration* config)
 
 
 std::string
-strip_file_extension (const std::string infile)
+VideoUtils::strip_file_extension (const std::string infile)
 {
 	std::string rv;
 	char *ext, *bn = strdup(infile.c_str());
@@ -126,7 +127,7 @@ strip_file_extension (const std::string infile)
 }
 
 std::string
-get_file_extension (const std::string infile)
+VideoUtils::get_file_extension (const std::string infile)
 {
 	std::string rv = "";
 	char *ext, *bn = strdup(infile.c_str());
@@ -140,13 +141,13 @@ get_file_extension (const std::string infile)
 }
 
 std::string
-video_dest_file (const std::string dir, const std::string infile)
+VideoUtils::video_dest_file (const std::string dir, const std::string infile)
 {
 	return dir + "a3_" + strip_file_extension(Glib::path_get_basename(infile)) + ".avi";
 }
 
 std::string
-video_map_path (std::string server_docroot, std::string filepath)
+VideoUtils::video_map_path (std::string server_docroot, std::string filepath)
 {
 	std::string rv = filepath;
 
@@ -179,7 +180,7 @@ video_map_path (std::string server_docroot, std::string filepath)
 }
 
 void
-ParseCSV (const std::string &csv, std::vector<std::vector<std::string> > &lines)
+VideoUtils::ParseCSV (const std::string &csv, std::vector<std::vector<std::string> > &lines)
 {
 	bool inQuote(false);
 	bool newLine(false);
@@ -236,7 +237,7 @@ ParseCSV (const std::string &csv, std::vector<std::vector<std::string> > &lines)
 }
 
 bool
-video_query_info (
+VideoUtils::video_query_info (
 		std::string video_server_url,
 		std::string filepath,
 		double &video_file_fps,
@@ -247,52 +248,32 @@ video_query_info (
 {
 	char url[2048];
 
-	snprintf(url, sizeof(url), "%s%sinfo/?file=%s&format=plain"
+	snprintf(url, sizeof(url), "%s%sinfo/?file=%s&format=csv"
 			, video_server_url.c_str()
 			, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
 			, filepath.c_str());
-	char *res = curl_http_get(url, NULL);
-	int pid=0;
-	if (res) {
-		char *pch, *pst;
-		int version;
-		pch = strtok_r(res, "\n", &pst);
-		while (pch) {
-#if 0 /* DEBUG */
-			printf("VideoFileInfo [%i] -> '%s'\n", pid, pch);
-#endif
-			switch (pid) {
-				case 0:
-				  version = atoi(pch);
-					if (version != 1) break;
-				case 1:
-				  video_file_fps = atof(pch);
-					break;
-				case 2:
-					video_duration = atoll(pch);
-					break;
-				case 3:
-					video_start_offset = atof(pch);
-					break;
-				case 4:
-					video_aspect_ratio = atof(pch);
-					break;
-				default:
-					break;
-			}
-			pch = strtok_r(NULL,"\n", &pst);
-			++pid;
-		}
-	  free(res);
+	char *res = a3_curl_http_get(url, NULL);
+	if (!res) {
+		return false;
 	}
-	if (pid!=5) {
+
+	std::vector<std::vector<std::string> > lines;
+	ParseCSV(std::string(res), lines);
+	free(res);
+
+	if (lines.empty() || lines.at(0).empty() || lines.at(0).size() != 6) {
 		return false;
 	}
+	if (atoi(lines.at(0).at(0)) != 1) return false; // version
+	video_start_offset = 0.0;
+	video_aspect_ratio = atof (lines.at(0).at(3));
+	video_file_fps = atof (lines.at(0).at(4));
+	video_duration = atoll(lines.at(0).at(5));
 	return true;
 }
 
 void
-video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img)
+VideoUtils::video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img)
 {
 
 	int rowstride = img->get_rowstride();
@@ -314,3 +295,71 @@ video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img)
 		if (n_channels>3) p[3] = 255;
 	}
 }
+
+
+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;
+		//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, ARDOUR_USER_AGENT);
+		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 913af2a..7f6f605 100644
--- a/gtk2_ardour/utils_videotl.h
+++ b/gtk2_ardour/utils_videotl.h
@@ -32,6 +32,8 @@
 #include "ardour/template_utils.h"
 #include "ardour_dialog.h"
 
+namespace VideoUtils {
+
 bool confirm_video_outfn (std::string, std::string docroot="");
 std::string video_dest_dir (const std::string, const std::string);
 std::string video_dest_file (const std::string, const std::string);
@@ -52,5 +54,10 @@ bool video_query_info (
 		double &video_start_offset,
 		double &video_aspect_ratio
 		);
+};
+
+extern "C" {
+	char *a3_curl_http_get (const char *u, int *status);
+}
 
 #endif /* __gtk_ardour_video_utils_h__ */
diff --git a/gtk2_ardour/video_image_frame.cc b/gtk2_ardour/video_image_frame.cc
index 46fd644..38a7a59 100644
--- a/gtk2_ardour/video_image_frame.cc
+++ b/gtk2_ardour/video_image_frame.cc
@@ -36,6 +36,7 @@
 
 using namespace std;
 using namespace ARDOUR;
+using namespace VideoUtils;
 
 VideoImageFrame::VideoImageFrame (PublicEditor& ed, ArdourCanvas::Group& parent, int w, int h, std::string vsurl, std::string vfn)
 	: editor (ed)
@@ -196,7 +197,7 @@ http_get_thread (void *arg) {
 	int timeout = 1000; // * 5ms -> 5sec
 	char *res = NULL;
 	do {
-		res=curl_http_get(url, &status);
+		res=a3_curl_http_get(url, &status);
 		if (status == 503) usleep(5000); // try-again
 	} while (status == 503 && --timeout > 0);
 
@@ -301,70 +302,3 @@ VideoImageFrame::http_get_again(framepos_t /*fn*/) {
 	http_get_thread(this);
 }
 
-
-extern "C" {
-#include <curl/curl.h>
-
-	struct MemoryStruct {
-		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 MemoryStruct *mem = (struct MemoryStruct *)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 *curl_http_get (const char *u, int *status) {
-		CURL *curl;
-		CURLcode res;
-		struct MemoryStruct chunk;
-		long int httpstatus;
-		if (status) *status = 0;
-		//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, ARDOUR_USER_AGENT);
-		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("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/video_image_frame.h b/gtk2_ardour/video_image_frame.h
index feeab37..b6d45db 100644
--- a/gtk2_ardour/video_image_frame.h
+++ b/gtk2_ardour/video_image_frame.h
@@ -105,8 +105,4 @@ class VideoImageFrame : public sigc::trackable
 
 };
 
-extern "C" {
-	char *curl_http_get (const char *u, int *status);
-}
-
 #endif /* __ardour_video_image_frame_h__ */
diff --git a/gtk2_ardour/video_server_dialog.cc b/gtk2_ardour/video_server_dialog.cc
index 8838409..811c00f 100644
--- a/gtk2_ardour/video_server_dialog.cc
+++ b/gtk2_ardour/video_server_dialog.cc
@@ -37,6 +37,7 @@ using namespace Gtk;
 using namespace std;
 using namespace PBD;
 using namespace ARDOUR;
+using namespace VideoUtils;
 
 VideoServerDialog::VideoServerDialog (Session* s)
 	: ArdourDialog (_("Launch Video Server"))
@@ -87,8 +88,10 @@ VideoServerDialog::VideoServerDialog (Session* s)
 	}
 	else {
 		PBD::warning <<
-			_("The external video server 'harvid' can not be found. The tool is included with the Ardour releases from ardour.org, "
-			  "alternatively you can download it from http://x42.github.com/harvid/ or acquire it from your distribution.") << endmsg;
+			string_compose(
+			_("The external video server 'harvid' can not be found. 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."), PROGRAM_NAME)
+			<< endmsg;
 	}
 
 
@@ -129,7 +132,9 @@ VideoServerDialog::VideoServerDialog (Session* s)
 	t->attach (*l, 0, 1, 2, 3, FILL);
 	t->attach (cachesize_spinner, 1, 2, 2, 3);
 
-	l = manage (new Label (_("Ardour relies on an external Video Server for the videotimeline.\nThe server configured in Edit -> Prefereces -> Video is not reachable.\nDo you want ardour to launch 'harvid' on this machine?"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
+	l = manage (new Label (string_compose(
+					_("%1 relies on an external Video Server for the videotimeline.\nThe server configured in Edit -> Prefereces -> Video is not reachable.\nDo you want ardour to launch 'harvid' on this machine?"), PROGRAM_NAME)
+				, Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
 	l->set_max_width_chars(80);
 	l->set_line_wrap();
 	vbox->pack_start (*l, true, true, 4);
diff --git a/gtk2_ardour/video_timeline.cc b/gtk2_ardour/video_timeline.cc
index bf52791..75f6150 100644
--- a/gtk2_ardour/video_timeline.cc
+++ b/gtk2_ardour/video_timeline.cc
@@ -45,6 +45,7 @@ using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 using namespace Timecode;
+using namespace VideoUtils;
 
 VideoTimeLine::VideoTimeLine (PublicEditor *ed, ArdourCanvas::Group *vbg, int initial_height)
 	: editor (ed)
@@ -124,6 +125,7 @@ VideoTimeLine::close_session ()
 	video_filename = "";
 	video_duration = 0;
 	GuiUpdate("set-xjadeo-sensitive-off");
+	GuiUpdate("video-unavailable");
 }
 
 void
@@ -465,6 +467,8 @@ VideoTimeLine::video_file_info (std::string filename, bool local)
 			video_server_url, translated_filename(),
 			video_file_fps, _duration, _start_offset, video_aspect_ratio)) {
 		warning << _("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?") << endmsg;
+		video_duration = 0;
+		GuiUpdate("set-xjadeo-sensitive-off");
 		GuiUpdate("video-unavailable");
 		return false;
 	}
@@ -499,14 +503,18 @@ VideoTimeLine::video_file_info (std::string filename, bool local)
 				_session->config.set_timecode_format(timecode_60);
 				break;
 			default:
-				warning << _("Failed to set session-framerate: ") << video_file_fps << _(" does not have a corresponding option setting in Ardour.") << endmsg; /* TODO: gettext arg */
+				warning << string_compose (
+						_("Failed to set session-framerate: '%1' does not have a corresponding option setting in %2."),
+						video_file_fps, PROGRAM_NAME ) << endmsg;
 				break;
 		}
 		_session->config.set_video_pullup(0); /* TODO only set if set_timecode_format() was successful ?!*/
 	}
 	if (floor(video_file_fps*100) != floor(_session->timecode_frames_per_second()*100)) {
-		warning << _("Video file's framerate is not equal to Ardour session timecode's framerate: ")
-		        << video_file_fps << _(" vs ") << _session->timecode_frames_per_second() << endmsg;
+		warning << string_compose(
+				_("Video file's framerate is not equal to %1 session timecode's framerate: '%2' vs '%3'"),
+					PROGRAM_NAME, video_file_fps, _session->timecode_frames_per_second())
+				<< endmsg;
 	}
 	flush_local_cache ();
 
@@ -545,7 +553,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=curl_http_get(url, NULL);
+	char *res=a3_curl_http_get(url, NULL);
 	if (res) {
 		if (strstr(res, "status: ok, online.")) { ok = true; }
 		free(res);
@@ -567,7 +575,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=curl_http_get(url, NULL);
+	char *res=a3_curl_http_get(url, NULL);
 	if (!res) {
 		return false;
 	}
@@ -577,8 +585,8 @@ VideoTimeLine::check_server_docroot ()
 			|| lines.at(0).empty()
 			|| lines.at(0).at(0) != video_get_docroot(Config)) {
 		warning << string_compose(
-				_("Video-server docroot mismatch. Ardour: '%1', video-server: '%2'. This usually means that the video server was not started by ardour and uses a different document-root."),
-				video_get_docroot(Config), lines.at(0).at(0))
+				_("Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually means that the video server was not started by ardour and uses a different document-root."),
+				PROGRAM_NAME, video_get_docroot(Config), lines.at(0).at(0))
 		<< endmsg;
 		ok = false; // TODO allow to override
 	}
@@ -663,7 +671,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=curl_http_get(url, NULL);
+	char *res=a3_curl_http_get(url, NULL);
 	if (res) {
 		free (res);
 	}
@@ -811,8 +819,8 @@ VideoTimeLine::terminated_video_monitor () {
 		vmonitor->save_session();
 		delete vmonitor;
 	}
-	GuiUpdate("set-xjadeo-active-off");
 	vmonitor=0;
+	GuiUpdate("set-xjadeo-active-off");
 	if (reopen_vmonitor) {
 		reopen_vmonitor=false;
 		open_video_monitor();
diff --git a/gtk2_ardour/video_timeline.h b/gtk2_ardour/video_timeline.h
index fbf563e..c96c9b1 100644
--- a/gtk2_ardour/video_timeline.h
+++ b/gtk2_ardour/video_timeline.h
@@ -96,7 +96,7 @@ class VideoTimeLine : public sigc::trackable, public ARDOUR::SessionHandlePtr, p
 	float get_apv(); /* audio frames per video frame; */
 	ARDOUR::framecnt_t get_duration () { return video_duration;}
 	ARDOUR::frameoffset_t get_offset () { return video_offset;}
-	ARDOUR::frameoffset_t quantify_frames_to_apv (ARDOUR::frameoffset_t offset) { return floor(offset/get_apv())*get_apv(); }
+	ARDOUR::frameoffset_t quantify_frames_to_apv (ARDOUR::frameoffset_t offset) { return rint(offset/get_apv())*get_apv(); }
 	void set_offset (ARDOUR::frameoffset_t offset) { video_offset = quantify_frames_to_apv(offset); } // this function does not update video_offset_p, call save_undo() to finalize changes to this! - this fn is currently only used from editor_drag.cc
 
 	protected:
diff --git a/gtk2_ardour/visual_time_axis.cc b/gtk2_ardour/visual_time_axis.cc
deleted file mode 100644
index 3961bf8..0000000
--- a/gtk2_ardour/visual_time_axis.cc
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
-    Copyright (C) 2003 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 <cstdlib>
-#include <cmath>
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "pbd/error.h"
-#include "pbd/stl_delete.h"
-#include "pbd/whitespace.h"
-
-#include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/selector.h>
-#include <gtkmm2ext/gtk_ui.h>
-#include <gtkmm2ext/choice.h>
-
-#include "ardour/session.h"
-#include "ardour/utils.h"
-#include "ardour/processor.h"
-#include "ardour/location.h"
-
-#include "ardour_ui.h"
-#include "public_editor.h"
-#include "imageframe_time_axis.h"
-#include "imageframe_time_axis_view.h"
-#include "marker_time_axis_view.h"
-#include "imageframe_view.h"
-#include "marker_time_axis.h"
-#include "marker_view.h"
-#include "utils.h"
-#include "prompter.h"
-#include "rgb_macros.h"
-#include "canvas_impl.h"
-
-#include "i18n.h"
-
-using namespace ARDOUR;
-using namespace PBD;
-using namespace Gtk;
-
-/**
- * Abstract Constructor for base visual time axis classes
- *
- * @param name the name/Id of thie TimeAxis
- * @param ed the Ardour PublicEditor
- * @param sess the current session
- * @param canvas the parent canvas object
- */
-VisualTimeAxis::VisualTimeAxis(const string & name, PublicEditor& ed, ARDOUR::Session* sess, Canvas& canvas)
-	: AxisView(sess),
-	  TimeAxisView(sess,ed,(TimeAxisView*) 0, canvas),
-	  visual_button (_("v")),
-	  size_button (_("h"))
-{
-	time_axis_name = name ;
-	_color = unique_random_color() ;
-
-	name_entry.signal_activate().connect(sigc::mem_fun(*this, &VisualTimeAxis::name_entry_changed)) ;
-	name_entry.signal_button_press_event().connect(sigc::mem_fun(*this, &VisualTimeAxis::name_entry_button_press_handler)) ;
-	name_entry.signal_button_release_event().connect(sigc::mem_fun(*this, &VisualTimeAxis::name_entry_button_release_handler)) ;
-	name_entry.signal_key_release_event().connect(sigc::mem_fun(*this, &VisualTimeAxis::name_entry_key_release_handler)) ;
-
-	size_button.set_name("TrackSizeButton") ;
-	visual_button.set_name("TrackVisualButton") ;
-	hide_button.set_name("TrackRemoveButton") ;
-	hide_button.add(*(Gtk::manage(new Gtk::Image(get_xpm("small_x.xpm")))));
-	size_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VisualTimeAxis::size_click)) ;
-	visual_button.signal_clicked().connect (sigc::mem_fun (*this, &VisualTimeAxis::visual_click)) ;
-	hide_button.signal_clicked().connect (sigc::mem_fun (*this, &VisualTimeAxis::hide_click)) ;
-	ARDOUR_UI::instance()->set_tip(size_button,_("Display Height")) ;
-	ARDOUR_UI::instance()->set_tip(visual_button, _("Visual options")) ;
-	ARDOUR_UI::instance()->set_tip(hide_button, _("Hide this track")) ;
-
-	controls_table.attach (hide_button, 0, 1, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
-	controls_table.attach (visual_button, 1, 2, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
-	controls_table.attach (size_button, 2, 3, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
-
-	/* remove focus from the buttons */
-	size_button.unset_flags(Gtk::CAN_FOCUS) ;
-	hide_button.unset_flags(Gtk::CAN_FOCUS) ;
-	visual_button.unset_flags(Gtk::CAN_FOCUS) ;
-
-	set_height (hNormal) ;
-}
-
-/**
- * VisualTimeAxis Destructor
- *
- */
-VisualTimeAxis::~VisualTimeAxis()
-{
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Name/Id Accessors/Mutators
-
-void
-VisualTimeAxis::set_time_axis_name(const string & name, void* src)
-{
-	std::string old_name = time_axis_name ;
-
-	if(name != time_axis_name)
-	{
-		time_axis_name = name ;
-		label_view() ;
-		editor.route_name_changed(this) ;
-
-		 NameChanged(time_axis_name, old_name, src) ; /* EMIT_SIGNAL */
-	}
-}
-
-std::string
-VisualTimeAxis::name() const
-{
-	return(time_axis_name) ;
-}
-
-
-//---------------------------------------------------------------------------------------//
-// ui methods & data
-
-/**
- * Sets the height of this TrackView to one of the defined TrackHeghts
- *
- * @param h
- */
-void
-VisualTimeAxis::set_height(uint32_t h)
-{
-	TimeAxisView::set_height(h);
-
-	if (h >= hNormal) {
-		other_button_hbox.show_all() ;
-	} else if (h >= hSmaller) {
-		other_button_hbox.hide_all() ;
-	} else if (h >= hSmall) {
-		other_button_hbox.hide_all() ;
-	}
-}
-
-/**
- * Handle the visuals button click
- *
- */
-void
-VisualTimeAxis::visual_click()
-{
-	popup_display_menu(0);
-}
-
-
-/**
- * Handle the hide buttons click
- *
- */
-void
-VisualTimeAxis::hide_click()
-{
-	// LAME fix for hide_button display refresh
-	hide_button.set_sensitive(false);
-
-	editor.hide_track_in_display (*this);
-
-	hide_button.set_sensitive(true);
-}
-
-
-/**
- * Allows the selection of a new color for this TimeAxis
- *
- */
-void
-VisualTimeAxis::select_track_color ()
-{
-	if(choose_time_axis_color())
-	{
-		//Does nothing at this abstract point
-	}
-}
-
-/**
- * Provides a color chooser for the selection of a new time axis color.
- *
- */
-bool
-VisualTimeAxis::choose_time_axis_color()
-{
-	bool picked ;
-	Gdk::Color color ;
-	gdouble current[4] ;
-	Gdk::Color current_color ;
-
-	current[0] = _color.get_red() / 65535.0 ;
-	current[1] = _color.get_green() / 65535.0 ;
-	current[2] = _color.get_blue() / 65535.0 ;
-	current[3] = 1.0 ;
-
-	current_color.set_rgb_p (current[0],current[1],current[2]);
-	color = Gtkmm2ext::UI::instance()->get_color(_("Color Selection"),picked, &current_color) ;
-
-	if (picked)
-	{
-		set_time_axis_color(color) ;
-	}
-	return(picked) ;
-}
-
-/**
- * Sets the color of this TimeAxis to the specified color c
- *
- * @param c the new TimeAxis color
- */
-void
-VisualTimeAxis::set_time_axis_color(Gdk::Color c)
-{
-	_color = c ;
-}
-
-void
-VisualTimeAxis::set_selected_regionviews (RegionSelection& regions)
-{
-	// Not handled by purely visual TimeAxis
-}
-
-//---------------------------------------------------------------------------------------//
-// Handle time axis removal
-
-/**
- * Handles the Removal of this VisualTimeAxis
- *
- * @param src the identity of the object that initiated the change
- */
-void
-VisualTimeAxis::remove_this_time_axis(void* src)
-{
-	vector<string> choices;
-
-	std::string prompt  = string_compose (_("Do you really want to remove track \"%1\" ?\n\nYou may also lose the playlist used by this track.\n\n(This action cannot be undone, and the session file will be overwritten)"), time_axis_name);
-
-	choices.push_back (_("No, do nothing."));
-	choices.push_back (_("Yes, remove it."));
-
-	Gtkmm2ext::Choice prompter (prompt, choices);
-
-	if (prompter.run () == 1) {
-		/*
-		  defer to idle loop, otherwise we'll delete this object
-		  while we're still inside this function ...
-		*/
-		Glib::signal_idle().connect(sigc::bind(sigc::ptr_fun(&VisualTimeAxis::idle_remove_this_time_axis), this, src));
-	}
-}
-
-/**
- * Callback used to remove this time axis during the gtk idle loop
- * This is used to avoid deleting the obejct while inside the remove_this_time_axis
- * method
- *
- * @param ta the VisualTimeAxis to remove
- * @param src the identity of the object that initiated the change
- */
-gint
-VisualTimeAxis::idle_remove_this_time_axis(VisualTimeAxis* ta, void* src)
-{
-	 ta->VisualTimeAxisRemoved(ta->name(), src) ; /* EMIT_SIGNAL */
-	delete ta ;
-	ta = 0 ;
-	return(false) ;
-}
-
-
-
-
-//---------------------------------------------------------------------------------------//
-// Handle TimeAxis rename
-
-/**
- * Construct a new prompt to receive a new name for this TimeAxis
- *
- * @see finish_time_axis_rename()
- */
-void
-VisualTimeAxis::start_time_axis_rename()
-{
-	ArdourPrompter name_prompter;
-
-	name_prompter.set_prompt (_("new name: ")) ;
-	name_prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT);
-	name_prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
-	name_prompter.show_all() ;
-
-	switch (name_prompter.run ()) {
-	case Gtk::RESPONSE_ACCEPT:
-	  string result;
-	  name_prompter.get_result (result);
-	  if (result.length()) {
-		  if (editor.get_named_time_axis(result) != 0) {
-		    ARDOUR_UI::instance()->popup_error (_("A track already exists with that name"));
-		    return ;
-		  }
-
-		  set_time_axis_name(result, this) ;
-	  }
-	}
-	label_view() ;
-}
-
-/**
- * Handles the new name for this TimeAxis from the name prompt
- *
- * @see start_time_axis_rename()
- */
-
-void
-VisualTimeAxis::label_view()
-{
-	name_label.set_text (time_axis_name);
-	name_entry.set_text (time_axis_name);
-	ARDOUR_UI::instance()->set_tip (name_entry, Glib::Markup::escape_text (time_axis_name));
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Handle name entry signals
-
-void
-VisualTimeAxis::name_entry_changed()
-{
-	TimeAxisView::name_entry_changed ();
-
-	string x = name_entry.get_text ();
-
-	if (x == time_axis_name) {
-		return;
-	}
-
-	strip_whitespace_edges(x);
-
-	if (x.length() == 0) {
-		name_entry.set_text (time_axis_name);
-		return;
-	}
-
-	if (!editor.get_named_time_axis(x)) {
-		set_time_axis_name (x, this);
-	} else {
-		ARDOUR_UI::instance()->popup_error (_("A track already exists with that name"));
-		name_entry.set_text(time_axis_name);
-	}
-}
-
-bool
-VisualTimeAxis::name_entry_button_press_handler(GdkEventButton *ev)
-{
-	if (ev->button == 3) {
-                return true;
-	}
-	return false
-}
-
-bool
-VisualTimeAxis::name_entry_button_release_handler(GdkEventButton *ev)
-{
-	return false;
-}
-
-bool
-VisualTimeAxis::name_entry_key_release_handler(GdkEventKey* ev)
-{
-	switch (ev->keyval) {
-	case GDK_Tab:
-	case GDK_Up:
-	case GDK_Down:
-		name_entry_changed ();
-		return true;
-
-	default:
-		break;
-	}
-
-        return false;
-}
-
-
-//---------------------------------------------------------------------------------------//
-// Super class methods not handled by VisualTimeAxis
-
-void
-VisualTimeAxis::show_timestretch (framepos_t start, framepos_t end, int layers, int layer)
-{
-	// Not handled by purely visual TimeAxis
-}
-
-void
-VisualTimeAxis::hide_timestretch()
-{
-	// Not handled by purely visual TimeAxis
-}
-
-
diff --git a/gtk2_ardour/visual_time_axis.h b/gtk2_ardour/visual_time_axis.h
deleted file mode 100644
index a692482..0000000
--- a/gtk2_ardour/visual_time_axis.h
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
-    Copyright (C) 2003 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_visual_time_axis_h__
-#define __ardour_visual_time_axis_h__
-
-#include <gtkmm/box.h>
-#include <gtkmm/button.h>
-
-#include <gtkmm2ext/selector.h>
-
-#include "ardour_dialog.h"
-#include "route_ui.h"
-#include "enums.h"
-#include "time_axis_view.h"
-#include "canvas.h"
-
-namespace ARDOUR
-{
-	class Session ;
-}
-
-class PublicEditor;
-class ImageFrameView;
-class ImageFrameTimeAxisView;
-class MarkersTimeAxisView;
-class TimeSelection;
-class RegionSelection;
-class MarkerTimeAxis;
-class TimeAxisViewStrip;
-
-/**
- * Base Abstact Class for TimeAxis views that operate purely within the visual domain.
- *
- * This class provides many of the common methods required for visual TimeAxis views. The aim is
- * to provide an abstract layer during the developmnt of the visual based time axis'. Many of these
- * methods have a better home further up the class heirarchy, and in fact some are replication of
- * methods found within RouteUI. This, however, has been required due to various problems with previous
- * versions of g++, mainly 2.95, which are not correctly handling virtual methods, virtual base classes,
- * and virtual methods when used with Multiple Inheritance. Perhaps these could be combined once the
- * compilers all agree on hos do to do stuff...
- */
-class VisualTimeAxis : public TimeAxisView
-{
-	public:
-		//---------------------------------------------------------------------------------------//
-		// Constructor / Desctructor
-
-		/**
-		 * VisualTimeAxis Destructor
-		 *
-		 */
-		virtual ~VisualTimeAxis() ;
-
-		//---------------------------------------------------------------------------------------//
-		// Name/Id Accessors/Mutators
-
-		/**
-		 * Returns the name of this TimeAxis
-		 *
-		 * @return the name of this TimeAxis
-		 */
-		virtual std::string name() const ;
-
-		/**
-		 * Sets the name of this TimeAxis
-		 *
-		 * @param name the new name of this TimeAxis
-		 * @param src the identity of the object that initiated the change
-		 */
-		virtual void set_time_axis_name(const std::string & name, void* src) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// ui methods & data
-
-		/**
-		 * Sets the height of this TrackView to one of the defined TrackHeghts
-		 *
-		 * @param h the number of pixels to set the height to
-		 */
-		virtual void set_height (uint32_t);
-
-		//---------------------------------------------------------------------------------------//
-		// Selection Methods
-		// selection methods are not handled by visual time axis object yet...
-
-		/**
-		 * Not implemented
-		 */
-		virtual void set_selected_regionviews(RegionSelection&) ;
-
-
-		//---------------------------------------------------------------------------------//
-		// Emitted Signals
-
-		/**
-		 * Emitted when we have changed the gui, and what we have shanged
-		 */
-		sigc::signal<void,const std::string &,void*> gui_changed ;
-
-		/**
-		 * Emitted when this Visual Time Axis has been removed
-		 * This is different to the CatchDeletion signal in that this signal
-		 * is emitted during the deletion of this Time Axis, and not during
-		 * the destructor, this allows us to capture the source of the deletion
-		 * event
-		 */
-		sigc::signal<void,const std::string &,void*> VisualTimeAxisRemoved ;
-
-		/**
-		 * Emitted when we have changed the name of this TimeAxis
-		 */
-		sigc::signal<void,const std::string &,const std::string &,void*> NameChanged ;
-
-		/**
-		 * Emitted when this time axis has been selected for removal
-		 */
-		//sigc::signal<void,std::std::string,void*> VisualTimeAxisRemoved ;
-
-		//---------------------------------------------------------------------------------------//
-		// Constructor / Desctructor
-
-		/**
-		 * Abstract Constructor for base visual time axis classes
-		 *
-		 * @param name the name/Id of thie TimeAxis
-		 * @param ed the Ardour PublicEditor
-		 * @param sess the current session
-		 * @param canvas the parent canvas object
-		 */
-		VisualTimeAxis(const std::string & name, PublicEditor& ed, ARDOUR::Session* sess, ArdourCanvas::Canvas& canvas) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Handle time axis removal
-
-		/**
-		 * Handles the Removal of this VisualTimeAxis
-		 *
-		 * @param src the identity of the object that initiated the change
-		 */
-		virtual void remove_this_time_axis(void* src) ;
-
-		/**
-		 * Callback used to remove this time axis during the gtk idle loop
-		 * This is used to avoid deleting the obejct while inside the remove_this_time_axis
-		 * method
-		 *
-		 * @param ta the VisualTimeAxis to remove
-		 * @param src the identity of the object that initiated the change
-		 */
-		static gint idle_remove_this_time_axis(VisualTimeAxis* ta, void* src) ;
-
-
-
-		//---------------------------------------------------------------------------------------//
-		// ui methods & data
-
-		/**
-		 * Handle the visuals button click
-		 *
-		 */
-		void visual_click() ;
-
-		/**
-		 * Handle the hide buttons click
-		 *
-		 */
-		void hide_click() ;
-
-		/**
-		 * Allows the selection of a new color for this TimeAxis
-		 *
-		 */
-		virtual void select_track_color() ;
-
-		/**
-		 * Provides a color chooser for the selection of a new time axis color.
-		 *
-		 */
-		 bool choose_time_axis_color() ;
-
-		/**
-		 * Sets the color of this TimeAxis to the specified color c
-		 *
-		 * @param c the new TimeAxis color
-		 */
-		void set_time_axis_color(Gdk::Color c) ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Handle TimeAxis rename
-
-		/**
-		 * Construct a new prompt to receive a new name for this TimeAxis
-		 *
-		 * @see finish_time_axis_rename()
-		 */
-		void start_time_axis_rename() ;
-
-		/**
-		 * Handles the new name for this TimeAxis from the name prompt
-		 *
-		 * @see start_time_axis_rename()
-		 */
-		virtual void label_view() ;
-
-
-		//---------------------------------------------------------------------------------------//
-		// Handle name entry signals
-
-		void name_entry_changed() ;
-		bool name_entry_key_release_handler(GdkEventKey*) ;
-
-		//---------------------------------------------------------------------------------------//
-		// VisualTimeAxis Widgets
-		Gtk::HBox other_button_hbox ;
-		Gtk::Button hide_button ;
-		Gtk::Button visual_button ;
-		Gtk::Button size_button ;
-
-		/** the name of this TimeAxis object */
-		std::string time_axis_name ;
-
-		//---------------------------------------------------------------------------------------//
-		// Super class methods not handled by VisualTimeAxis
-
-		/**
-		 * Not handled by purely Visual TimeAxis
-		 *
-		 * @todo should VisualTimeAxis handle this?
-		 */
-		void show_timestretch (nframes_t start, nframes_t end, int layers, int layer);
-
-		/**
-		 * Not handle by purely visual TimeAxis
-		 * @see show_timestratch
-		 */
-		virtual void hide_timestretch() ;
-
-	private:
-
-};
-
-#endif /* __ardour_visual_time_axis_h__ */
-
diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc
index b76958d..5fa1b6c 100644
--- a/gtk2_ardour/window_manager.cc
+++ b/gtk2_ardour/window_manager.cc
@@ -52,6 +52,10 @@ Manager::Manager ()
 {
 }
 
+Manager::~Manager ()
+{
+}
+
 void
 Manager::register_window (ProxyBase* info)
 {
@@ -120,11 +124,9 @@ Manager::add_state (XMLNode& root) const
 void
 Manager::set_session (ARDOUR::Session* s)
 {
+	SessionHandlePtr::set_session (s);
 	for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) {
-		ARDOUR::SessionHandlePtr* sp = (*i)->session_handle ();
-		if (sp) {
-			sp->set_session (s);
-		}
+		(*i)->set_session(s);
 	}
 }
 
@@ -263,8 +265,27 @@ ProxyBase::toggle()
 		_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);
+			}
+		}
 	}
 }
 
@@ -281,8 +302,10 @@ ProxyBase::get_state () const
 		/* we have a window, so use current state */
 
 		_visible = vistracker->partially_visible ();
-		_window->get_position (_x_off, _y_off);
-		_window->get_size (_width, _height);
+		if (_visible) {
+			_window->get_position (_x_off, _y_off);
+			_window->get_size (_width, _height);
+		}
 	}
 
 	node->add_property (X_("visible"), _visible? X_("yes") : X_("no"));
@@ -325,6 +348,7 @@ ProxyBase::setup ()
 	assert (_window);
 
 	vistracker = new Gtkmm2ext::VisibilityTracker (*_window);
+	_window->signal_delete_event().connect (sigc::mem_fun (*this, &ProxyBase::handle_win_event));
 
 	if (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1) {
 		/* cancel any mouse-based positioning */
@@ -338,6 +362,7 @@ ProxyBase::setup ()
 	if (_x_off != -1 && _y_off != -1) {
 		_window->move (_x_off, _y_off);
 	}
+	set_session(_session);
 }
 	
 void
@@ -379,10 +404,27 @@ ProxyBase::hide ()
 {
 	Gtk::Window* win = get (false);
 	if (win) {
+		save_pos_and_size();
 		win->hide ();
 	}
 }
 
+bool
+ProxyBase::handle_win_event (GdkEventAny *ev)
+{
+	hide();
+	return true;
+}
+
+void
+ProxyBase::save_pos_and_size ()
+{
+	Gtk::Window* win = get (false);
+	if (win) {
+		win->get_position (_x_off, _y_off);
+		win->get_size (_width, _height);
+	}
+}
 /*-----------------------*/
 
 ProxyTemporary::ProxyTemporary (const string& name, Gtk::Window* win)
@@ -395,6 +437,7 @@ ProxyTemporary::~ProxyTemporary ()
 {
 }
 
+
 ARDOUR::SessionHandlePtr*
 ProxyTemporary::session_handle()
 {
diff --git a/gtk2_ardour/window_manager.h b/gtk2_ardour/window_manager.h
index 7138a95..ca33b30 100644
--- a/gtk2_ardour/window_manager.h
+++ b/gtk2_ardour/window_manager.h
@@ -47,7 +47,7 @@ namespace WM {
 
 class ProxyBase;
 
-class Manager 
+class Manager : public ARDOUR::SessionHandlePtr
 {
   public:
     static Manager& instance();
@@ -75,7 +75,7 @@ class Manager
     static Manager* _instance;
 };
 	
-class ProxyBase : public sigc::trackable {
+class ProxyBase : public ARDOUR::SessionHandlePtr, public sigc::trackable {
   public:
     ProxyBase (const std::string& name, const std::string& menu_name);
     ProxyBase (const std::string& name, const std::string& menu_name, const XMLNode&);
@@ -106,7 +106,7 @@ class ProxyBase : public sigc::trackable {
     XMLNode& get_state () const;
     
     virtual ARDOUR::SessionHandlePtr* session_handle () = 0;
-    
+
     operator bool() const { return _window != 0; }
     
   protected:
@@ -120,6 +120,9 @@ class ProxyBase : public sigc::trackable {
     mutable int  _width; ///< width
     mutable int  _height; ///< height
     Gtkmm2ext::VisibilityTracker* vistracker;
+
+    void save_pos_and_size ();
+    bool handle_win_event (GdkEventAny *ev);
     
     void setup ();
 };
@@ -137,7 +140,7 @@ class ProxyTemporary: public ProxyBase {
     Gtk::Window* operator->() { 
 	    return _window;
     }
-    
+
     ARDOUR::SessionHandlePtr* session_handle ();
 };
 	
@@ -148,7 +151,7 @@ class ProxyWithConstructor: public ProxyBase {
 	    : 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) {}
+	    : ProxyBase (name, menu_name, *node) , creator (c) {}
 	
     Gtk::Window* get (bool create = false) { 
 	    if (!_window) {
@@ -175,6 +178,15 @@ class ProxyWithConstructor: public ProxyBase {
 	    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;
 };
@@ -186,7 +198,7 @@ class Proxy : public ProxyBase {
 	    : ProxyBase (name, menu_name) {}
 
     Proxy (const std::string& name, const std::string& menu_name, const XMLNode* node)
-	    : ProxyBase (name, menu_name, node)  {}
+	    : ProxyBase (name, menu_name, *node)  {}
 	
     Gtk::Window* get (bool create = false) { 
 	    if (!_window) {
@@ -213,6 +225,15 @@ class Proxy : public ProxyBase {
 	    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;
 };
diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript
index 5a8ecc7..bb4e203 100644
--- a/gtk2_ardour/wscript
+++ b/gtk2_ardour/wscript
@@ -145,6 +145,9 @@ gtk2_ardour_sources = [
         'mixer_group_tabs.cc',
         'mixer_strip.cc',
         'mixer_ui.cc',
+        'meterbridge.cc',
+        'meter_strip.cc',
+        'meter_patterns.cc',
         'monitor_section.cc',
         'mono_panner.cc',
         'mono_panner_editor.cc',
diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc
index f60240f..c97d624 100644
--- a/libs/ardour/amp.cc
+++ b/libs/ardour/amp.cc
@@ -61,7 +61,7 @@ Amp::display_name() const
 }
 
 bool
-Amp::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+Amp::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	out = in;
 	return true;
diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h
index 23cc0ad..e21cf62 100644
--- a/libs/ardour/ardour/amp.h
+++ b/libs/ardour/ardour/amp.h
@@ -40,7 +40,7 @@ public:
 
 	bool visible () const;
 
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	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);
diff --git a/libs/ardour/ardour/audio_diskstream.h b/libs/ardour/ardour/audio_diskstream.h
index cbc6b93..b636cb4 100644
--- a/libs/ardour/ardour/audio_diskstream.h
+++ b/libs/ardour/ardour/audio_diskstream.h
@@ -152,6 +152,7 @@ class AudioDiskstream : public Diskstream
 	friend class AudioTrack;
 
         int  process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_disk_signal);
+        frameoffset_t calculate_playback_distance (pframes_t nframes);
 	bool commit  (framecnt_t);
 
   private:
diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h
index 36e82da..007390b 100644
--- a/libs/ardour/ardour/audio_unit.h
+++ b/libs/ardour/ardour/audio_unit.h
@@ -104,7 +104,7 @@ class AUPlugin : public ARDOUR::Plugin
 
 	bool has_editor () const;
 
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	ChanCount output_streams() const;
 	ChanCount input_streams() const;
 	bool configure_io (ChanCount in, ChanCount out);
diff --git a/libs/ardour/ardour/capturing_processor.h b/libs/ardour/ardour/capturing_processor.h
index b672d1a..5b9ea51 100644
--- a/libs/ardour/ardour/capturing_processor.h
+++ b/libs/ardour/ardour/capturing_processor.h
@@ -38,7 +38,7 @@ class CapturingProcessor : public Processor
 	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);
 	bool configure_io (ChanCount in, ChanCount out);
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	virtual XMLNode& state (bool);
 
   private:
diff --git a/libs/ardour/ardour/dB.h b/libs/ardour/ardour/dB.h
index d2675fb..4d5f6c9 100644
--- a/libs/ardour/ardour/dB.h
+++ b/libs/ardour/ardour/dB.h
@@ -31,7 +31,7 @@ static inline float fast_coefficient_to_dB (float coeff) {
 }
 
 static inline float accurate_coefficient_to_dB (float coeff) {
-	return 20.0f * log10 (coeff);
+	return 20.0f * log10f (coeff);
 }
 
 extern double zero_db_as_fraction;
diff --git a/libs/ardour/ardour/delivery.h b/libs/ardour/ardour/delivery.h
index 314b223..4a6d436 100644
--- a/libs/ardour/ardour/delivery.h
+++ b/libs/ardour/ardour/delivery.h
@@ -67,7 +67,7 @@ public:
 	std::string display_name() const;
 
 	Role role() const { return _role; }
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	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);
diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h
index 85ca03c..427b52b 100644
--- a/libs/ardour/ardour/diskstream.h
+++ b/libs/ardour/ardour/diskstream.h
@@ -193,6 +193,7 @@ class Diskstream : public SessionObject, public PublicDiskstream
 	friend class Track;
 
     virtual int  process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_disk_signal) = 0;
+    virtual frameoffset_t calculate_playback_distance (pframes_t nframes) = 0;
 	virtual bool commit  (framecnt_t) = 0;
 
 	//private:
diff --git a/libs/ardour/ardour/iec1ppmdsp.h b/libs/ardour/ardour/iec1ppmdsp.h
new file mode 100644
index 0000000..58dea97
--- /dev/null
+++ b/libs/ardour/ardour/iec1ppmdsp.h
@@ -0,0 +1,51 @@
+/*
+    Copyright (C) 2012 Fons Adriaensen <fons at linuxaudio.org>
+    Adopted for Ardour 2013 by 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 __IEC1PPMDSP_H
+#define	__IEC1PPMDSP_H
+
+
+class Iec1ppmdsp
+{
+public:
+
+    Iec1ppmdsp (void);
+    ~Iec1ppmdsp (void);
+
+    void process (float *p, int n);  
+    float read (void);
+    void reset ();
+
+    static void init (float fsamp); 
+
+private:
+
+    float          _z1;          // filter state
+    float          _z2;          // filter state
+    float          _m;           // max value since last read()
+    bool           _res;         // flag to reset m
+
+    static float   _w1;          // attack filter coefficient
+    static float   _w2;          // attack filter coefficient
+    static float   _w3;          // release filter coefficient
+    static float   _g;           // gain factor
+};
+
+
+#endif
diff --git a/libs/ardour/ardour/iec2ppmdsp.h b/libs/ardour/ardour/iec2ppmdsp.h
new file mode 100644
index 0000000..3574a8b
--- /dev/null
+++ b/libs/ardour/ardour/iec2ppmdsp.h
@@ -0,0 +1,51 @@
+/*
+    Copyright (C) 2012 Fons Adriaensen <fons at linuxaudio.org>
+    Adopted for Ardour 2013 by 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 __IEC2PPMDSP_H
+#define	__IEC2PPMDSP_H
+
+
+class Iec2ppmdsp
+{
+public:
+
+    Iec2ppmdsp (void);
+    ~Iec2ppmdsp (void);
+
+    void process (float *p, int n);  
+    float read (void);
+    void reset ();
+
+    static void init (float fsamp); 
+
+private:
+
+    float          _z1;          // filter state
+    float          _z2;          // filter state
+    float          _m;           // max value since last read()
+    bool           _res;         // flag to reset m
+
+    static float   _w1;          // attack filter coefficient
+    static float   _w2;          // attack filter coefficient
+    static float   _w3;          // release filter coefficient
+    static float   _g;           // gain factor
+};
+
+
+#endif
diff --git a/libs/ardour/ardour/internal_return.h b/libs/ardour/ardour/internal_return.h
index c7fe04c..4d2b32f 100644
--- a/libs/ardour/ardour/internal_return.h
+++ b/libs/ardour/ardour/internal_return.h
@@ -39,7 +39,7 @@ class InternalReturn : public Return
 
 	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
 	bool configure_io (ChanCount, ChanCount);
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 
 	void add_send (InternalSend *);
 	void remove_send (InternalSend *);
diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h
index 8bfb0de..a7f0f73 100644
--- a/libs/ardour/ardour/internal_send.h
+++ b/libs/ardour/ardour/internal_send.h
@@ -42,7 +42,7 @@ class InternalSend : public Send
 	void cycle_start (pframes_t);
 	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
 	bool feeds (boost::shared_ptr<Route> other) const;
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
 	int  set_block_size (pframes_t);
 
diff --git a/gtk2_ardour/progress_reporter.h b/libs/ardour/ardour/kmeterdsp.h
similarity index 53%
copy from gtk2_ardour/progress_reporter.h
copy to libs/ardour/ardour/kmeterdsp.h
index 2afa4ad..eca3c76 100644
--- a/gtk2_ardour/progress_reporter.h
+++ b/libs/ardour/ardour/kmeterdsp.h
@@ -1,5 +1,6 @@
 /*
-    Copyright (C) 2010 Paul Davis
+    Copyright (C) 2008-2011 Fons Adriaensen <fons at linuxaudio.org>
+    Adopted for Ardour 2013 by 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
@@ -14,28 +15,32 @@
     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_progress_reporter_h__
-#define __ardour_progress_reporter_h__
-
-#include "ardour/progress.h"
+#ifndef __KMETERDSP_H
+#define	__KMETERDSP_H
 
-/** A parent class for classes which can report progress on something */
-class ProgressReporter : public ARDOUR::Progress
+class Kmeterdsp
 {
 public:
-	ProgressReporter ();
-	virtual ~ProgressReporter ();
+
+    Kmeterdsp (void);
+    ~Kmeterdsp (void);
+
+    void process (float *p, int n);
+    float read ();
+    void reset ();
+
+    static void init (int fsamp);
 
 private:
-	void set_overall_progress (float);
 
-	/** Update our GUI to reflect progress.
-	 *  @param p Progress, from 0 to 1.
-	 */
-	virtual void update_progress_gui (float p) = 0;
+    float          _z1;          // filter state
+    float          _z2;          // filter state
+    float          _rms;         // max rms value since last read()
+    bool           _flag;        // flag set by read(), resets _rms
+
+    static float   _omega;       // ballistics filter constant.
 };
 
 #endif
diff --git a/libs/ardour/ardour/linux_vst_support.h b/libs/ardour/ardour/linux_vst_support.h
old mode 100755
new mode 100644
diff --git a/libs/ardour/ardour/export_formats_search_path.h b/libs/ardour/ardour/lv2_bundled_search_path.h
similarity index 77%
copy from libs/ardour/ardour/export_formats_search_path.h
copy to libs/ardour/ardour/lv2_bundled_search_path.h
index 7b6fcea..f5780c5 100644
--- a/libs/ardour/ardour/export_formats_search_path.h
+++ b/libs/ardour/ardour/lv2_bundled_search_path.h
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2011 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
@@ -14,10 +14,11 @@
     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_export_formats_search_path_h__
-#define __ardour_export_formats_search_path_h__
+#ifndef ARDOUR_LV2_BUNDLED_SEARCH_PATH_INCLUDED
+#define ARDOUR_LV2_BUNDLED_SEARCH_PATH_INCLUDED
 
 #include "pbd/search_path.h"
 
@@ -25,10 +26,10 @@ namespace ARDOUR {
 
 	/**
 	 * return a SearchPath containing directories in which to look for
-	 * export_formats.
+	 * lv2 plugins.
 	 */
-	PBD::SearchPath export_formats_search_path ();
+	PBD::SearchPath lv2_bundled_search_path ();
 
 } // namespace ARDOUR
 
-#endif /* __ardour_export_formats_search_path_h__ */
+#endif
diff --git a/libs/ardour/ardour/lxvst_plugin.h b/libs/ardour/ardour/lxvst_plugin.h
old mode 100755
new mode 100644
diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h
index eea240f..df1e381 100644
--- a/libs/ardour/ardour/meter.h
+++ b/libs/ardour/ardour/meter.h
@@ -24,6 +24,11 @@
 #include "ardour/processor.h"
 #include "pbd/fastlog.h"
 
+#include "ardour/kmeterdsp.h"
+#include "ardour/iec1ppmdsp.h"
+#include "ardour/iec2ppmdsp.h"
+#include "ardour/vumeterdsp.h"
+
 namespace ARDOUR {
 
 class BufferSet;
@@ -45,12 +50,13 @@ class Metering {
 class PeakMeter : public Processor {
 public:
         PeakMeter(Session& s, const std::string& name);
+        ~PeakMeter();
 
 	void meter();
 	void reset ();
 	void reset_max ();
 
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
 
 	/* special method for meter, to ensure that it can always handle the maximum
@@ -69,6 +75,9 @@ public:
 	/** Compute peaks */
 	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
 
+	void activate ()   { }
+	void deactivate () { }
+
 	ChanCount input_streams () const { return current_meters; }
 	ChanCount output_streams () const { return current_meters; }
 
@@ -80,16 +89,15 @@ public:
 		}
 	}
 
-	float max_peak_power (uint32_t n) {
-		if (n < _max_peak_power.size()) {
-			return _max_peak_power[n];
-		} else {
-			return minus_infinity();
-		}
-	}
+	float meter_level (uint32_t n, MeterType type);
+
+	void set_type(MeterType t);
+	MeterType get_type() { return _meter_type; }
 
 	XMLNode& state (bool full);
 
+	PBD::Signal1<void, MeterType> TypeChanged;
+
 private:
 	friend class IO;
 
@@ -99,11 +107,18 @@ private:
 	 */
 	ChanCount current_meters;
 
-	std::vector<float> _peak_power;
+	std::vector<float> _peak_signal;
 	std::vector<float> _visible_peak_power;
+	std::vector<float> _max_peak_signal;
 	std::vector<float> _max_peak_power;
-};
 
+	std::vector<Kmeterdsp *> _kmeter;
+	std::vector<Iec1ppmdsp *> _iec1meter;
+	std::vector<Iec2ppmdsp *> _iec2meter;
+	std::vector<Vumeterdsp *> _vumeter;
+
+	MeterType _meter_type;
+};
 
 } // namespace ARDOUR
 
diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h
index d6ad718..34fa0ae 100644
--- a/libs/ardour/ardour/midi_diskstream.h
+++ b/libs/ardour/ardour/midi_diskstream.h
@@ -125,6 +125,7 @@ class MidiDiskstream : public Diskstream
 	friend class MidiTrack;
 
         int  process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_diskstream);
+        frameoffset_t calculate_playback_distance (pframes_t nframes);
 	bool commit  (framecnt_t nframes);
 	static framecnt_t midi_readahead;
 
diff --git a/libs/ardour/ardour/monitor_processor.h b/libs/ardour/ardour/monitor_processor.h
index 5b724b5..64d3b86 100644
--- a/libs/ardour/ardour/monitor_processor.h
+++ b/libs/ardour/ardour/monitor_processor.h
@@ -118,7 +118,7 @@ public:
 	int set_state (const XMLNode&, int /* version */);
 
 	bool configure_io (ChanCount in, ChanCount out);
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 
 	void set_cut_all (bool);
 	void set_dim_all (bool);
diff --git a/libs/ardour/ardour/panner_shell.h b/libs/ardour/ardour/panner_shell.h
index 7d24adb..dba5826 100644
--- a/libs/ardour/ardour/panner_shell.h
+++ b/libs/ardour/ardour/panner_shell.h
@@ -53,7 +53,7 @@ public:
 
 	std::string describe_parameter (Evoral::Parameter param);
 
-	bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) const { return true; };
+	bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return true; };
 	void configure_io (ChanCount in, ChanCount out);
 
 	/// The fundamental Panner function
diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h
index 9e4f5c4..55b76fb 100644
--- a/libs/ardour/ardour/plugin.h
+++ b/libs/ardour/ardour/plugin.h
@@ -242,7 +242,7 @@ class 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*/) const { return false; }
+	virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return false; }
 	virtual ChanCount output_streams() const;
 	virtual ChanCount input_streams() const;
 
diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h
index d80c759..a1b9c5a 100644
--- a/libs/ardour/ardour/plugin_insert.h
+++ b/libs/ardour/ardour/plugin_insert.h
@@ -69,7 +69,7 @@ class PluginInsert : public Processor
 	bool     set_count (uint32_t num);
 	uint32_t get_count () const { return _plugins.size(); }
 
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
 
 	bool has_no_inputs() const;
@@ -160,6 +160,8 @@ class PluginInsert : public Processor
 	BufferSet _signal_analysis_inputs;
 	BufferSet _signal_analysis_outputs;
 
+	ChanCount midi_bypass;
+
 	/** Description of how we can match our plugin's IO to our own insert IO */
 	struct Match {
 		Match () : method (Impossible), plugins (0) {}
@@ -170,7 +172,7 @@ class PluginInsert : public Processor
 		ChanCount hide;        ///< number of channels to hide
 	};
 
-	Match private_can_support_io_configuration (ChanCount const &, ChanCount &) const;
+	Match private_can_support_io_configuration (ChanCount const &, ChanCount &);
 
 	/** details of the match currently being used */
 	Match _match;
diff --git a/libs/ardour/ardour/port_insert.h b/libs/ardour/ardour/port_insert.h
index 657c2c0..abd9fb7 100644
--- a/libs/ardour/ardour/port_insert.h
+++ b/libs/ardour/ardour/port_insert.h
@@ -57,7 +57,7 @@ class PortInsert : public IOProcessor
 
 	bool set_name (const std::string& name);
 
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
 
 	void activate ();
diff --git a/libs/ardour/ardour/process_thread.h b/libs/ardour/ardour/process_thread.h
index 0c197e9..f96595f 100644
--- a/libs/ardour/ardour/process_thread.h
+++ b/libs/ardour/ardour/process_thread.h
@@ -45,7 +45,8 @@ public:
 	 */
 
 	static BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
-	static BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO);
+	static BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = false);
+	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 ();
 	static gain_t* send_gain_automation_buffer ();
diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h
index d497f56..772ae35 100644
--- a/libs/ardour/ardour/processor.h
+++ b/libs/ardour/ardour/processor.h
@@ -82,7 +82,7 @@ class Processor : public SessionObject, public Automatable, public Latent
 
 	/* Derived classes should override these, or processor appears as an in-place pass-through */
 
-	virtual bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const = 0;
+	virtual bool can_support_io_configuration (const ChanCount& in, ChanCount& out) = 0;
 	virtual ChanCount input_streams () const { return _configured_input; }
 	virtual ChanCount output_streams() const { return _configured_output; }
 
diff --git a/libs/ardour/ardour/public_diskstream.h b/libs/ardour/ardour/public_diskstream.h
old mode 100755
new mode 100644
diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h
index f19f8fe..e05efbd 100644
--- a/libs/ardour/ardour/rc_configuration_vars.h
+++ b/libs/ardour/ardour/rc_configuration_vars.h
@@ -148,7 +148,13 @@ CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", fal
 /* metering */
 
 CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100.0f)
-CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 32.0f)
+CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 13.3f)
+CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUstandard)
+CONFIG_VARIABLE (MeterLineUp, meter_line_up_level, "meter-line-up-level", MeteringLineUp18)
+CONFIG_VARIABLE (MeterLineUp, meter_line_up_din, "meter-line-up-din", MeteringLineUp15)
+CONFIG_VARIABLE (float, meter_peak, "meter-peak", 0.0f)
+CONFIG_VARIABLE (bool, meter_style_led, "meter-style-led", true)
+CONFIG_VARIABLE (bool, show_editor_meter, "show-editor-meter", true)
 
 /* miscellany */
 
@@ -192,6 +198,7 @@ CONFIG_VARIABLE (bool, sound_midi_notes, "sound-midi-notes", false)
 CONFIG_VARIABLE (bool, use_plugin_own_gui, "use-plugin-own-gui", true)
 CONFIG_VARIABLE (uint32_t, max_recent_sessions, "max-recent-sessions", 10)
 CONFIG_VARIABLE (double, automation_thinning_factor, "automation-thinning-factor", 20.0)
+CONFIG_VARIABLE (std::string, freesound_download_dir, "freesound-download-dir", Glib::get_home_dir() + "/Freesound/snd")
 
 /* denormal management */
 
diff --git a/libs/ardour/ardour/return.h b/libs/ardour/ardour/return.h
index 55ca2d8..6dcd6ac 100644
--- a/libs/ardour/ardour/return.h
+++ b/libs/ardour/ardour/return.h
@@ -56,7 +56,7 @@ public:
 
 	uint32_t pans_required() const { return _configured_input.n_audio(); }
 
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
 
 	static uint32_t how_many_returns();
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 0bd3b07..23f24cb 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -181,6 +181,9 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
 	MeterPoint   meter_point() const { return _meter_point; }
 	void         meter ();
 
+	void         set_meter_type (MeterType t) { _meter_type = t; }
+	MeterType    meter_type() const { return _meter_type; }
+
 	/* Processors */
 
 	boost::shared_ptr<Amp> amp() const  { return _amp; }
@@ -486,6 +489,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
 	Flag           _flags;
 	int            _pending_declick;
 	MeterPoint     _meter_point;
+	MeterType      _meter_type;
 	boost::dynamic_bitset<> _phase_invert;
 	bool           _self_solo;
 	uint32_t       _soloed_by_others_upstream;
@@ -526,6 +530,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
 	void silence_unlocked (framecnt_t);
 
 	ChanCount processor_max_streams;
+	ChanCount processor_out_streams;
 
 	uint32_t pans_required() const;
 	ChanCount n_process_buffers ();
@@ -549,8 +554,10 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
 	void output_change_handler (IOChange, void *src);
 
 	bool input_port_count_changing (ChanCount);
+	bool output_port_count_changing (ChanCount);
 
 	bool _in_configure_processors;
+	bool _initial_io_setup;
 
 	int configure_processors_unlocked (ProcessorStreams*);
 	std::list<std::pair<ChanCount, ChanCount> > try_configure_processors (ChanCount, ProcessorStreams *);
diff --git a/libs/ardour/ardour/send.h b/libs/ardour/ardour/send.h
index fa023a3..1a21d1d 100644
--- a/libs/ardour/ardour/send.h
+++ b/libs/ardour/ardour/send.h
@@ -56,7 +56,7 @@ class Send : public Delivery
 
 	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
 
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
 
 	void activate ();
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index a149224..efe51e7 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -200,7 +200,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
 	void process (pframes_t nframes);
 
 	BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
-	BufferSet& get_scratch_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);
 
 	bool have_rec_enabled_track () const;
@@ -813,6 +814,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
 
 	void send_mmc_locate (framepos_t);
 	int send_full_time_code (framepos_t);
+	void send_song_position_pointer (framepos_t);
 
 	bool step_editing() const { return (_step_editors > 0); }
 
@@ -1209,6 +1211,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
 	double            ltc_enc_cnt;
 	framepos_t        ltc_enc_off;
 	bool              restarting;
+	framepos_t        ltc_prev_cycle;
 
 	framepos_t        ltc_timecode_offset;
 	bool              ltc_timecode_negative_offset;
diff --git a/libs/ardour/ardour/session_configuration_vars.h b/libs/ardour/ardour/session_configuration_vars.h
index 9def8f3..5e93c01 100644
--- a/libs/ardour/ardour/session_configuration_vars.h
+++ b/libs/ardour/ardour/session_configuration_vars.h
@@ -57,3 +57,11 @@ 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, 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)
+CONFIG_VARIABLE (bool, show_rec_on_meterbridge, "show-rec-on-meterbridge", true)
+CONFIG_VARIABLE (bool, show_mute_on_meterbridge, "show-mute-on-meterbridge", false)
+CONFIG_VARIABLE (bool, show_solo_on_meterbridge, "show-solo-on-meterbridge", false)
+CONFIG_VARIABLE (bool, show_name_on_meterbridge, "show-name-on-meterbridge", true)
+CONFIG_VARIABLE (uint32_t, meterbridge_label_height,  "meterbridge-label-height", 0)
diff --git a/libs/ardour/ardour/thread_buffers.h b/libs/ardour/ardour/thread_buffers.h
index cd0b765..9d92454 100644
--- a/libs/ardour/ardour/thread_buffers.h
+++ b/libs/ardour/ardour/thread_buffers.h
@@ -38,6 +38,7 @@ public:
 
 	BufferSet* silent_buffers;
 	BufferSet* scratch_buffers;
+	BufferSet* route_buffers;
 	BufferSet* mix_buffers;
 	gain_t*    gain_automation_buffer;
 	gain_t*    send_gain_automation_buffer;
diff --git a/libs/ardour/ardour/ticker.h b/libs/ardour/ardour/ticker.h
index 23d2ef2..b6e5376 100644
--- a/libs/ardour/ardour/ticker.h
+++ b/libs/ardour/ardour/ticker.h
@@ -19,6 +19,7 @@
 */
 
 #include <boost/noncopyable.hpp>
+#include <boost/scoped_ptr.hpp>
 
 #include "pbd/signals.h"
 
@@ -42,7 +43,7 @@ class MidiClockTicker : public SessionHandlePtr, boost::noncopyable
 {
 public:
 	MidiClockTicker ();
-	virtual ~MidiClockTicker() {};
+	virtual ~MidiClockTicker();
 
 	void tick (const framepos_t& transport_frames);
 
@@ -63,6 +64,9 @@ public:
 	/// slot for the signal session::TransportLooped
 	void transport_looped();
 
+	/// slot for the signal session::Located
+	void session_located();
+
 	/// pulses per quarter note (default 24)
 	void set_ppqn(int ppqn) { _ppqn = ppqn; }
 
@@ -71,12 +75,16 @@ private:
 	int          _ppqn;
 	double       _last_tick;
 
+	class Position;
+	boost::scoped_ptr<Position> _pos;
+
 	double one_ppqn_in_frames (framepos_t transport_position);
 
 	void send_midi_clock_event (pframes_t offset);
 	void send_start_event (pframes_t offset);
 	void send_continue_event (pframes_t offset);
 	void send_stop_event (pframes_t offset);
+	void send_position_event (uint32_t midi_clocks, pframes_t offset);
 };
 
 }
diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h
index 5bd03d2..2115149 100644
--- a/libs/ardour/ardour/types.h
+++ b/libs/ardour/ardour/types.h
@@ -177,6 +177,20 @@ namespace ARDOUR {
 		MeterCustom
 	};
 
+	enum MeterType {
+		MeterMaxSignal = 0x001,
+		MeterMaxPeak   = 0x002,
+		MeterPeak      = 0x004,
+		MeterKrms      = 0x008,
+		MeterK20       = 0x010,
+		MeterK14       = 0x020,
+		MeterIEC1DIN   = 0x040,
+		MeterIEC1NOR   = 0x080,
+		MeterIEC2BBC   = 0x100,
+		MeterIEC2EBU   = 0x200,
+		MeterVU        = 0x400
+	};
+
 	enum TrackMode {
 		Normal,
 		NonLayered,
@@ -308,10 +322,12 @@ namespace ARDOUR {
 		MeterFalloffOff = 0,
 		MeterFalloffSlowest = 1,
 		MeterFalloffSlow = 2,
-		MeterFalloffMedium = 3,
-		MeterFalloffFast = 4,
-		MeterFalloffFaster = 5,
-		MeterFalloffFastest = 6
+		MeterFalloffSlowish = 3,
+		MeterFalloffModerate = 4,
+		MeterFalloffMedium = 5,
+		MeterFalloffFast = 6,
+		MeterFalloffFaster = 7,
+		MeterFalloffFastest = 8,
 	};
 
 	enum MeterHold {
@@ -367,6 +383,20 @@ namespace ARDOUR {
 		MeteringRoute  ///< meter what is going through the route
 	};
 
+	enum VUMeterStandard {
+		MeteringVUfrench,   // 0VU = -2dBu
+		MeteringVUamerican, // 0VU =  0dBu
+		MeteringVUstandard, // 0VU = +4dBu
+		MeteringVUeight     // 0VU = +8dBu
+	};
+
+	enum MeterLineUp {
+		MeteringLineUp24,
+		MeteringLineUp20,
+		MeteringLineUp18,
+		MeteringLineUp15
+	};
+
 	enum PFLPosition {
 		/** PFL signals come from before pre-fader processors */
 		PFLFromBeforeProcessors,
@@ -567,6 +597,8 @@ std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf);
 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::VUMeterStandard& sf);
+std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& 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);
@@ -588,6 +620,8 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf);
 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::VUMeterStandard& sf);
+std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& 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);
diff --git a/libs/ardour/ardour/unknown_processor.h b/libs/ardour/ardour/unknown_processor.h
old mode 100755
new mode 100644
index 3698103..61a5734
--- a/libs/ardour/ardour/unknown_processor.h
+++ b/libs/ardour/ardour/unknown_processor.h
@@ -49,7 +49,7 @@ public:
 		return false;
 	}
 
-	bool can_support_io_configuration (const ChanCount &, ChanCount &) const {
+	bool can_support_io_configuration (const ChanCount &, ChanCount &) {
 		return false;
 	}
 
diff --git a/libs/ardour/ardour/utils.h b/libs/ardour/ardour/utils.h
index 0aa4193..bf91d4d 100644
--- a/libs/ardour/ardour/utils.h
+++ b/libs/ardour/ardour/utils.h
@@ -149,13 +149,15 @@ double slider_position_to_gain_with_max (double g, double max_gain = 2.0);
  * These rates are db/sec.
 */
 
-#define METER_FALLOFF_OFF     0.0f
-#define METER_FALLOFF_SLOWEST 6.6f // BBC standard
-#define METER_FALLOFF_SLOW    8.6f // BBC standard
-#define METER_FALLOFF_MEDIUM  20.0f
-#define METER_FALLOFF_FAST    32.0f
-#define METER_FALLOFF_FASTER  46.0f
-#define METER_FALLOFF_FASTEST 70.0f
+#define METER_FALLOFF_OFF       0.0f
+#define METER_FALLOFF_SLOWEST   6.6f  // BBC standard
+#define METER_FALLOFF_SLOW      8.6f  // BBC standard, EBU  24dB / 2.8sec
+#define METER_FALLOFF_SLOWISH   12.0f // DIN  20dB / 1.7 sec
+#define METER_FALLOFF_MODERATE  13.3f // EBU-PPM, IRT PPM-   20dB / 1.5 sec
+#define METER_FALLOFF_MEDIUM    20.0f
+#define METER_FALLOFF_FAST      32.0f
+#define METER_FALLOFF_FASTER    46.0f
+#define METER_FALLOFF_FASTEST   70.0f
 
 float meter_falloff_to_float (ARDOUR::MeterFalloff);
 ARDOUR::MeterFalloff meter_falloff_from_float (float);
diff --git a/libs/ardour/ardour/vestige/aeffectx.h b/libs/ardour/ardour/vestige/aeffectx.h
old mode 100755
new mode 100644
diff --git a/libs/ardour/ardour/progress.h b/libs/ardour/ardour/vumeterdsp.h
similarity index 52%
copy from libs/ardour/ardour/progress.h
copy to libs/ardour/ardour/vumeterdsp.h
index 10b7d75..86487e8 100644
--- a/libs/ardour/ardour/progress.h
+++ b/libs/ardour/ardour/vumeterdsp.h
@@ -1,5 +1,6 @@
 /*
-    Copyright (C) 2010 Paul Davis
+    Copyright (C) 2012 Fons Adriaensen <fons at linuxaudio.org>
+    Adopted for Ardour 2013 by 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
@@ -14,49 +15,35 @@
     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_progress_h__
-#define __ardour_progress_h__
-
-#include <list>
+#ifndef __VUMETERDSP_H
+#define	__VUMETERDSP_H
 
-namespace ARDOUR {
 
-/** A class to handle reporting of progress of something */
-class Progress
+class Vumeterdsp
 {
 public:
-	Progress ();
-	virtual ~Progress () {}
-	void set_progress (float);
 
-	void ascend ();
-	void descend (float);
+    Vumeterdsp (void);
+    ~Vumeterdsp (void);
 
-	bool cancelled () const;
+    void process (float *p, int n);  
+    float read (void);
+    void reset ();
 
-protected:
-	void cancel ();
+    static void init (float fsamp); 
 
 private:
-	/** Report overall progress.
-	 *  @param p Current progress (from 0 to 1)
-	 */
-	virtual void set_overall_progress (float p) = 0;
-
-	struct Level {
-		Level (float a) : allocation (a), normalised (0) {}
 
-		float allocation;
-		float normalised;
-	};
+    float          _z1;          // filter state
+    float          _z2;          // filter state
+    float          _m;           // max value since last read()
+    bool           _res;         // flag to reset m
 
-	std::list<Level> _stack;
-	bool _cancelled;
+    static float   _w;           // lowpass filter coefficient
+    static float   _g;           // gain factor
 };
 
-}
 
 #endif
diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc
index c302e06..b9ce987 100644
--- a/libs/ardour/audio_diskstream.cc
+++ b/libs/ardour/audio_diskstream.cc
@@ -700,6 +700,31 @@ AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
 	return 0;
 }
 
+frameoffset_t
+AudioDiskstream::calculate_playback_distance (pframes_t nframes)
+{
+	frameoffset_t playback_distance = nframes;
+
+	if (record_enabled()) {
+		playback_distance = nframes;
+	} else if (_actual_speed != 1.0f && _actual_speed != -1.0f) {
+		interpolation.set_speed (_target_speed);
+		boost::shared_ptr<ChannelList> c = channels.reader();
+		int channel = 0;
+		for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
+			playback_distance = interpolation.interpolate (channel, nframes, NULL, NULL);
+		}
+	} else {
+		playback_distance = nframes;
+	}
+
+	if (_actual_speed < 0.0) {
+		return -playback_distance;
+	} else {
+		return playback_distance;
+	}
+}
+
 /** Update various things including playback_sample, read pointer on each channel's playback_buf
  *  and write pointer on each channel's capture_buf.  Also wout whether the butler is needed.
  *  @return true if the butler is required.
@@ -900,7 +925,7 @@ AudioDiskstream::internal_playback_seek (framecnt_t distance)
 	boost::shared_ptr<ChannelList> c = channels.reader();
 
 	for (chan = c->begin(); chan != c->end(); ++chan) {
-		(*chan)->playback_buf->increment_read_ptr (distance);
+		(*chan)->playback_buf->increment_read_ptr (llabs(distance));
 	}
 
 	if (first_recordable_frame < max_framepos) {
diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc
index b4ca9e2..0530dbf 100644
--- a/libs/ardour/audio_track.cc
+++ b/libs/ardour/audio_track.cc
@@ -313,6 +313,12 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
 	Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
 
 	if (!lm.locked()) {
+		boost::shared_ptr<AudioDiskstream> diskstream = audio_diskstream();
+		framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes);
+		if (can_internal_playback_seek(llabs(playback_distance))) {
+			/* TODO should declick */
+			internal_playback_seek(playback_distance);
+		}
 		return 0;
 	}
 
@@ -325,6 +331,9 @@ 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())) {
+			_meter->reset();
+		}
 		return 0;
 	}
 
@@ -350,11 +359,11 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
 	_silent = false;
 	_amp->apply_gain_automation(false);
 
-	BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers ());
+	BufferSet& bufs = _session.get_route_buffers (n_process_buffers ());
 
 	fill_buffers_with_input (bufs, _input, nframes);
 	
-	if (_meter_point == MeterInput) {
+	if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
 		_meter->run (bufs, start_frame, end_frame, nframes, true);
 	}
 
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc
index 399ce8a..538a905 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -65,13 +65,6 @@ using namespace std;
 using namespace PBD;
 using namespace ARDOUR;
 
-#ifndef AU_STATE_SUPPORT
-static bool seen_get_state_message = false;
-static bool seen_set_state_message = false;
-static bool seen_loading_message = false;
-static bool seen_saving_message = false;
-#endif
-
 AUPluginInfo::CachedInfoMap AUPluginInfo::cached_info;
 
 static string preset_search_path = "/Library/Audio/Presets:/Network/Library/Audio/Presets";
@@ -1005,7 +998,7 @@ AUPlugin::output_streams() const
 }
 
 bool
-AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	// Note: We never attempt to multiply-instantiate plugins to meet io configurations.
 
@@ -1679,8 +1672,6 @@ void
 AUPlugin::add_state (XMLNode* root) const
 {
 	LocaleGuard lg (X_("POSIX"));
-
-#ifdef AU_STATE_SUPPORT
 	CFDataRef xmlData;
 	CFPropertyListRef propertyList;
 
@@ -1712,20 +1703,11 @@ AUPlugin::add_state (XMLNode* root) const
 
 	CFRelease (xmlData);
 	CFRelease (propertyList);
-#else
-	if (!seen_get_state_message) {
-		info << string_compose (_("Saving AudioUnit settings is not supported in this build of %1. Consider paying for a newer version"),
-					PROGRAM_NAME)
-		     << endmsg;
-		seen_get_state_message = true;
-	}
-#endif
 }
 
 int
 AUPlugin::set_state(const XMLNode& node, int version)
 {
-#ifdef AU_STATE_SUPPORT
 	int ret = -1;
 	CFPropertyListRef propertyList;
 	LocaleGuard lg (X_("POSIX"));
@@ -1735,6 +1717,7 @@ AUPlugin::set_state(const XMLNode& node, int version)
 		return -1;
 	}
 
+#ifndef NO_PLUGIN_STATE
 	if (node.children().empty()) {
 		return -1;
 	}
@@ -1770,17 +1753,10 @@ AUPlugin::set_state(const XMLNode& node, int version)
 		}
 		CFRelease (propertyList);
 	}
+#endif
 
 	Plugin::set_state (node, version);
 	return ret;
-#else
-	if (!seen_set_state_message) {
-		info << string_compose (_("Restoring AudioUnit settings is not supported in this build of %1. Consider paying for a newer version"),
-					PROGRAM_NAME)
-		     << endmsg;
-	}
-	return Plugin::set_state (node, version);
-#endif
 }
 
 bool
@@ -1788,7 +1764,6 @@ AUPlugin::load_preset (PresetRecord r)
 {
 	Plugin::load_preset (r);
 
-#ifdef AU_STATE_SUPPORT
 	bool ret = false;
 	CFPropertyListRef propertyList;
 	Glib::ustring path;
@@ -1836,15 +1811,6 @@ AUPlugin::load_preset (PresetRecord r)
 	}
 
 	return ret;
-#else
-	if (!seen_loading_message) {
-		info << string_compose (_("Loading AudioUnit presets is not supported in this build of %1. Consider paying for a newer version"),
-					PROGRAM_NAME)
-		     << endmsg;
-		seen_loading_message = true;
-	}
-	return true;
-#endif
 }
 
 void
@@ -1855,11 +1821,9 @@ AUPlugin::do_remove_preset (std::string)
 string
 AUPlugin::do_save_preset (string preset_name)
 {
-#ifdef AU_STATE_SUPPORT
 	CFPropertyListRef propertyList;
 	vector<Glib::ustring> v;
 	Glib::ustring user_preset_path;
-	bool ret = true;
 
 	std::string m = maker();
 	std::string n = name();
@@ -1878,12 +1842,12 @@ AUPlugin::do_save_preset (string preset_name)
 
 	if (g_mkdir_with_parents (user_preset_path.c_str(), 0775) < 0) {
 		error << string_compose (_("Cannot create user plugin presets folder (%1)"), user_preset_path) << endmsg;
-		return false;
+		return string();
 	}
 
 	DEBUG_TRACE (DEBUG::AudioUnits, "get current preset\n");
 	if (unit->GetAUPreset (propertyList) != noErr) {
-		return false;
+		return string();
 	}
 
 	// add the actual preset name */
@@ -1898,21 +1862,12 @@ AUPlugin::do_save_preset (string preset_name)
 
 	if (save_property_list (propertyList, user_preset_path)) {
 		error << string_compose (_("Saving plugin state to %1 failed"), user_preset_path) << endmsg;
-		ret = false;
+		return string();
 	}
 
 	CFRelease(propertyList);
 
 	return string ("file:///") + user_preset_path;
-#else
-	if (!seen_saving_message) {
-		info << string_compose (_("Saving AudioUnit presets is not supported in this build of %1. Consider paying for a newer version"),
-					PROGRAM_NAME)
-		     << endmsg;
-		seen_saving_message = true;
-	}
-	return string();
-#endif
 }
 
 //-----------------------------------------------------------------------------
@@ -2079,7 +2034,6 @@ AUPlugin::current_preset() const
 {
 	string preset_name;
 
-#ifdef AU_STATE_SUPPORT
 	CFPropertyListRef propertyList;
 
 	DEBUG_TRACE (DEBUG::AudioUnits, "get current preset for current_preset()\n");
@@ -2087,14 +2041,13 @@ AUPlugin::current_preset() const
 		preset_name = get_preset_name_in_plist (propertyList);
 		CFRelease(propertyList);
 	}
-#endif
+
 	return preset_name;
 }
 
 void
 AUPlugin::find_presets ()
 {
-#ifdef AU_STATE_SUPPORT
 	vector<string*>* preset_files;
 	PathScanner scanner;
 
@@ -2143,8 +2096,6 @@ AUPlugin::find_presets ()
 		string const uri = string_compose ("%1", _presets.size ());
 		_presets.insert (make_pair (uri, Plugin::PresetRecord (uri, i->first, i->second)));
 	}
-
-#endif
 }
 
 bool
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index 5b9d34f..08de549 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -759,9 +759,8 @@ void
 AudioEngine::meter_thread ()
 {
 	pthread_set_name (X_("meter"));
-
 	while (true) {
-		Glib::usleep (10000); /* 1/100th sec interval */
+		Glib::usleep (10000);
 		if (g_atomic_int_get(&m_meter_exit)) {
 			break;
 		}
diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc
index 74dd52d..84a5b68 100644
--- a/libs/ardour/audiosource.cc
+++ b/libs/ardour/audiosource.cc
@@ -182,7 +182,7 @@ AudioSource::touch_peakfile ()
 	struct utimbuf tbuf;
 
 	tbuf.actime = statbuf.st_atime;
-	tbuf.modtime = time ((time_t) 0);
+	tbuf.modtime = time ((time_t*) 0);
 
 	utime (peakpath.c_str(), &tbuf);
 }
diff --git a/libs/ardour/bundle.cc b/libs/ardour/bundle.cc
index f38fe0c..0ac62d7 100644
--- a/libs/ardour/bundle.cc
+++ b/libs/ardour/bundle.cc
@@ -205,6 +205,9 @@ Bundle::remove_channel (uint32_t ch)
 
 	Glib::Threads::Mutex::Lock lm (_channel_mutex);
 	_channel.erase (_channel.begin () + ch);
+
+	lm.release();
+	emit_changed (ConfigurationChanged);
 }
 
 /** Remove all channels */
@@ -214,6 +217,9 @@ Bundle::remove_channels ()
 	Glib::Threads::Mutex::Lock lm (_channel_mutex);
 
 	_channel.clear ();
+
+	lm.release();
+	emit_changed (ConfigurationChanged);
 }
 
 /** @param p Port name.
diff --git a/libs/ardour/capturing_processor.cc b/libs/ardour/capturing_processor.cc
index c4b463a..4a31d92 100644
--- a/libs/ardour/capturing_processor.cc
+++ b/libs/ardour/capturing_processor.cc
@@ -62,7 +62,7 @@ CapturingProcessor::configure_io (ChanCount in, ChanCount out)
 }
 
 bool
-CapturingProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+CapturingProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	out = in;
 	return true;
diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc
index 9eaf843..dfbe4c9 100644
--- a/libs/ardour/delivery.cc
+++ b/libs/ardour/delivery.cc
@@ -124,7 +124,7 @@ Delivery::display_name () const
 }
 
 bool
-Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	if (_role == Main) {
 
diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc
index b96394d..ab181d2 100644
--- a/libs/ardour/enums.cc
+++ b/libs/ardour/enums.cc
@@ -55,12 +55,15 @@ setup_enum_writer ()
 	AlignStyle _AlignStyle;
 	AlignChoice _AlignChoice;
 	MeterPoint _MeterPoint;
+	MeterType _MeterType;
 	TrackMode _TrackMode;
 	NoteMode _NoteMode;
 	ChannelMode _ChannelMode;
 	ColorMode _ColorMode;
 	MeterFalloff _MeterFalloff;
 	MeterHold _MeterHold;
+	VUMeterStandard _VUMeterStandard;
+	MeterLineUp _MeterLineUp;
 	EditMode _EditMode;
 	RegionPoint _RegionPoint;
 	Placement _Placement;
@@ -171,6 +174,19 @@ setup_enum_writer ()
 	REGISTER_ENUM (MeterCustom);
 	REGISTER (_MeterPoint);
 
+	REGISTER_ENUM (MeterMaxSignal);
+	REGISTER_ENUM (MeterMaxPeak);
+	REGISTER_ENUM (MeterPeak);
+	REGISTER_ENUM (MeterKrms);
+	REGISTER_ENUM (MeterK20);
+	REGISTER_ENUM (MeterK14);
+	REGISTER_ENUM (MeterIEC1DIN);
+	REGISTER_ENUM (MeterIEC1NOR);
+	REGISTER_ENUM (MeterIEC2BBC);
+	REGISTER_ENUM (MeterIEC2EBU);
+	REGISTER_ENUM (MeterVU);
+	REGISTER (_MeterType);
+
 	REGISTER_ENUM (Normal);
 	REGISTER_ENUM (NonLayered);
 	REGISTER_ENUM (Destructive);
@@ -193,6 +209,8 @@ setup_enum_writer ()
 	REGISTER_ENUM (MeterFalloffOff);
 	REGISTER_ENUM (MeterFalloffSlowest);
 	REGISTER_ENUM (MeterFalloffSlow);
+	REGISTER_ENUM (MeterFalloffSlowish);
+	REGISTER_ENUM (MeterFalloffModerate);
 	REGISTER_ENUM (MeterFalloffMedium);
 	REGISTER_ENUM (MeterFalloffFast);
 	REGISTER_ENUM (MeterFalloffFaster);
@@ -205,6 +223,18 @@ setup_enum_writer ()
 	REGISTER_ENUM (MeterHoldLong);
 	REGISTER (_MeterHold);
 
+	REGISTER_ENUM (MeteringVUfrench);
+	REGISTER_ENUM (MeteringVUamerican);
+	REGISTER_ENUM (MeteringVUstandard);
+	REGISTER_ENUM (MeteringVUeight);
+	REGISTER (_VUMeterStandard);
+
+	REGISTER_ENUM (MeteringLineUp24);
+	REGISTER_ENUM (MeteringLineUp20);
+	REGISTER_ENUM (MeteringLineUp18);
+	REGISTER_ENUM (MeteringLineUp15);
+	REGISTER (_MeterLineUp);
+
 	REGISTER_ENUM (Slide);
 	REGISTER_ENUM (Splice);
 	REGISTER_ENUM (Lock);
@@ -652,6 +682,34 @@ std::ostream& operator<<(std::ostream& o, const MonitorModel& var)
 	return o << s;
 }
 
+std::istream& operator>>(std::istream& o, VUMeterStandard& var)
+{
+	std::string s;
+	o >> s;
+	var = (VUMeterStandard) string_2_enum (s, var);
+	return o;
+}
+
+std::ostream& operator<<(std::ostream& o, const VUMeterStandard& var)
+{
+	std::string s = enum_2_string (var);
+	return o << s;
+}
+
+std::istream& operator>>(std::istream& o, MeterLineUp& var)
+{
+	std::string s;
+	o >> s;
+	var = (MeterLineUp) string_2_enum (s, var);
+	return o;
+}
+
+std::ostream& operator<<(std::ostream& o, const MeterLineUp& var)
+{
+	std::string s = enum_2_string (var);
+	return o << s;
+}
+
 std::istream& operator>>(std::istream& o, PFLPosition& var)
 {
 	std::string s;
diff --git a/libs/ardour/export_failed.cc b/libs/ardour/export_failed.cc
old mode 100755
new mode 100644
diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc
index d2fbdbf..cb0fa1b 100644
--- a/libs/ardour/graph.cc
+++ b/libs/ardour/graph.cc
@@ -19,7 +19,6 @@
 */
 #include <stdio.h>
 #include <cmath>
-#include <xmmintrin.h>
 
 #include "pbd/compose.h"
 #include "pbd/debug_rt_alloc.h"
diff --git a/libs/ardour/iec1ppmdsp.cc b/libs/ardour/iec1ppmdsp.cc
new file mode 100644
index 0000000..bed8250
--- /dev/null
+++ b/libs/ardour/iec1ppmdsp.cc
@@ -0,0 +1,100 @@
+/*
+    Copyright (C) 2012 Fons Adriaensen <fons at linuxaudio.org>
+    Adopted for Ardour 2013 by 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 <math.h>
+#include "ardour/iec1ppmdsp.h"
+
+
+float Iec1ppmdsp::_w1;
+float Iec1ppmdsp::_w2;
+float Iec1ppmdsp::_w3;
+float Iec1ppmdsp::_g;
+
+
+Iec1ppmdsp::Iec1ppmdsp (void) :
+    _z1 (0),
+    _z2 (0),
+    _m (0),
+    _res (true)
+{
+}
+
+
+Iec1ppmdsp::~Iec1ppmdsp (void)
+{
+}
+
+
+void Iec1ppmdsp::process (float *p, int n)
+{
+    float z1, z2, m, t;
+
+    z1 = _z1;
+    z2 = _z2;
+    m = _res ? 0: _m;
+    _res = false;
+
+    n /= 4;
+    while (n--)
+    {
+	z1 *= _w3;
+	z2 *= _w3;
+	t = fabsf (*p++);
+	if (t > z1) z1 += _w1 * (t - z1);
+	if (t > z2) z2 += _w2 * (t - z2);
+	t = fabsf (*p++);
+	if (t > z1) z1 += _w1 * (t - z1);
+	if (t > z2) z2 += _w2 * (t - z2);
+	t = fabsf (*p++);
+	if (t > z1) z1 += _w1 * (t - z1);
+	if (t > z2) z2 += _w2 * (t - z2);
+	t = fabsf (*p++);
+	if (t > z1) z1 += _w1 * (t - z1);
+	if (t > z2) z2 += _w2 * (t - z2);
+	t = z1 + z2;
+	if (t > m) m = t;
+    }
+
+    _z1 = z1 + 1e-10f;
+    _z2 = z2 + 1e-10f;
+    _m = m;
+}
+
+
+float Iec1ppmdsp::read (void)
+{
+    _res = true;
+    return _g * _m;
+}
+
+void Iec1ppmdsp::reset ()
+{
+    _z1 = _z2 = _m = .0f;
+    _res = true;
+}
+
+void Iec1ppmdsp::init (float fsamp)
+{
+    _w1 =  450.0f / fsamp;
+    _w2 = 1300.0f / fsamp;
+    _w3 = 1.0f - 5.4f / fsamp;
+    _g  = 0.5108f;
+}
+
+/* vi:set ts=8 sts=8 sw=4: */
diff --git a/libs/ardour/iec2ppmdsp.cc b/libs/ardour/iec2ppmdsp.cc
new file mode 100644
index 0000000..76862cc
--- /dev/null
+++ b/libs/ardour/iec2ppmdsp.cc
@@ -0,0 +1,100 @@
+/*
+    Copyright (C) 2012 Fons Adriaensen <fons at linuxaudio.org>
+    Adopted for Ardour 2013 by 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 <math.h>
+#include "ardour/iec2ppmdsp.h"
+
+
+float Iec2ppmdsp::_w1;
+float Iec2ppmdsp::_w2;
+float Iec2ppmdsp::_w3;
+float Iec2ppmdsp::_g;
+
+
+Iec2ppmdsp::Iec2ppmdsp (void) :
+    _z1 (0),
+    _z2 (0),
+    _m (0),
+    _res (true)
+{
+}
+
+
+Iec2ppmdsp::~Iec2ppmdsp (void)
+{
+}
+
+
+void Iec2ppmdsp::process (float *p, int n)
+{
+    float z1, z2, m, t;
+
+    z1 = _z1;
+    z2 = _z2;
+    m = _res ? 0: _m;
+    _res = false;
+
+    n /= 4;
+    while (n--)
+    {
+	z1 *= _w3;
+	z2 *= _w3;
+	t = fabsf (*p++);
+	if (t > z1) z1 += _w1 * (t - z1);
+	if (t > z2) z2 += _w2 * (t - z2);
+	t = fabsf (*p++);
+	if (t > z1) z1 += _w1 * (t - z1);
+	if (t > z2) z2 += _w2 * (t - z2);
+	t = fabsf (*p++);
+	if (t > z1) z1 += _w1 * (t - z1);
+	if (t > z2) z2 += _w2 * (t - z2);
+	t = fabsf (*p++);
+	if (t > z1) z1 += _w1 * (t - z1);
+	if (t > z2) z2 += _w2 * (t - z2);
+	t = z1 + z2;
+	if (t > m) m = t;
+    }
+
+    _z1 = z1 + 1e-10f;
+    _z2 = z2 + 1e-10f;
+    _m = m;
+}
+
+
+float Iec2ppmdsp::read (void)
+{
+    _res = true;
+    return _g * _m;
+}
+
+void Iec2ppmdsp::reset ()
+{
+    _z1 = _z2 = _m = .0f;
+    _res = true;
+}
+
+void Iec2ppmdsp::init (float fsamp)
+{
+    _w1 = 200.0f / fsamp;
+    _w2 = 860.0f / fsamp;
+    _w3 = 1.0f - 4.0f / fsamp;
+    _g = 0.5141f;
+}
+
+/* vi:set ts=8 sts=8 sw=4: */
diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc
index af6b611..fc59636 100644
--- a/libs/ardour/internal_return.cc
+++ b/libs/ardour/internal_return.cc
@@ -80,7 +80,7 @@ InternalReturn::get_state()
 }
 
 bool
-InternalReturn::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+InternalReturn::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	out = in;
 	return true;
diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc
index 26631d0..029a46c 100644
--- a/libs/ardour/internal_send.cc
+++ b/libs/ardour/internal_send.cc
@@ -284,7 +284,7 @@ InternalSend::connect_when_legal ()
 }
 
 bool
-InternalSend::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+InternalSend::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	out = in;
 	return true;
diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc
index cdb8a46..21fdca6 100644
--- a/libs/ardour/io.cc
+++ b/libs/ardour/io.cc
@@ -1639,7 +1639,9 @@ IO::process_input (boost::shared_ptr<Processor> proc, framepos_t start_frame, fr
 	}
 
 	_buffers.get_jack_port_addresses (_ports, nframes);
-	proc->run (_buffers, start_frame, end_frame, nframes, true);
+	if (proc) {
+		proc->run (_buffers, start_frame, end_frame, nframes, true);
+	}
 }
 
 void
diff --git a/libs/ardour/kmeterdsp.cc b/libs/ardour/kmeterdsp.cc
new file mode 100644
index 0000000..181378c
--- /dev/null
+++ b/libs/ardour/kmeterdsp.cc
@@ -0,0 +1,110 @@
+/*
+    Copyright (C) 2008-2011 Fons Adriaensen <fons at linuxaudio.org>
+    Adopted for Ardour 2013 by 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 <math.h>
+#include "ardour/kmeterdsp.h"
+
+
+float  Kmeterdsp::_omega;
+
+
+Kmeterdsp::Kmeterdsp (void) :
+    _z1 (0),
+    _z2 (0),
+    _rms (0),
+    _flag (false)
+{
+}
+
+
+Kmeterdsp::~Kmeterdsp (void)
+{
+}
+
+void Kmeterdsp::init (int fsamp)
+{
+    _omega = 9.72f / fsamp; // ballistic filter coefficient
+}
+
+void Kmeterdsp::process (float *p, int n)
+{
+    // Called by JACK's process callback.
+    //
+    // p : pointer to sample buffer
+    // n : number of samples to process
+
+    float  s, z1, z2;
+
+    // Get filter state.
+    z1 = _z1;
+    z2 = _z2;
+
+    // Perform filtering. The second filter is evaluated
+    // only every 4th sample - this is just an optimisation.
+    n /= 4;  // Loop is unrolled by 4.
+    while (n--)
+    {
+	s = *p++;
+	s *= s;
+	z1 += _omega * (s - z1);      // Update first filter.
+	s = *p++;
+	s *= s;
+	z1 += _omega * (s - z1);      // Update first filter.
+	s = *p++;
+	s *= s;
+	z1 += _omega * (s - z1);      // Update first filter.
+	s = *p++;
+	s *= s;
+	z1 += _omega * (s - z1);      // Update first filter.
+        z2 += 4 * _omega * (z1 - z2); // Update second filter.
+    }
+
+    // Save filter state. The added constants avoid denormals.
+    _z1 = z1 + 1e-20f;
+    _z2 = z2 + 1e-20f;
+
+    s = sqrtf (2.0f * z2);
+
+    if (_flag) // Display thread has read the rms value.
+    {
+	_rms  = s;
+	_flag = false;
+    }
+    else
+    {
+        // Adjust RMS value and update maximum since last read().
+        if (s > _rms) _rms = s;
+    }
+}
+
+/* Returns highest _rms value since last call */
+float Kmeterdsp::read ()
+{
+    float rv= _rms;
+    _flag = true; // Resets _rms in next process().
+    return rv;
+}
+
+void Kmeterdsp::reset ()
+{
+    _z1 = _z2 = _rms = .0f;
+    _flag = false;
+}
+
+/* vi:set ts=8 sts=8 sw=4: */
diff --git a/libs/ardour/ladspa_plugin.cc b/libs/ardour/ladspa_plugin.cc
index cebff59..5a6e577 100644
--- a/libs/ardour/ladspa_plugin.cc
+++ b/libs/ardour/ladspa_plugin.cc
@@ -34,6 +34,7 @@
 #include "pbd/compose.h"
 #include "pbd/error.h"
 #include "pbd/xml++.h"
+#include "pbd/stacktrace.h"
 
 #include "midi++/manager.h"
 
@@ -360,6 +361,7 @@ LadspaPlugin::set_state (const XMLNode& node, int version)
 		return set_state_2X (node, version);
 	}
 
+#ifndef NO_PLUGIN_STATE
 	XMLNodeList nodes;
 	XMLProperty *prop;
 	XMLNodeConstIterator iter;
@@ -367,6 +369,7 @@ LadspaPlugin::set_state (const XMLNode& node, int version)
 	const char *port;
 	const char *data;
 	uint32_t port_id;
+#endif
 	LocaleGuard lg (X_("POSIX"));
 
 	if (node.name() != state_node_name()) {
@@ -374,6 +377,8 @@ LadspaPlugin::set_state (const XMLNode& node, int version)
 		return -1;
 	}
 
+#ifndef NO_PLUGIN_STATE
+
 	nodes = node.children ("Port");
 
 	for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
@@ -396,6 +401,7 @@ LadspaPlugin::set_state (const XMLNode& node, int version)
 		sscanf (port, "%" PRIu32, &port_id);
 		set_parameter (port_id, atof(data));
 	}
+#endif
 
 	latency_compute_run ();
 
@@ -405,6 +411,7 @@ LadspaPlugin::set_state (const XMLNode& node, int version)
 int
 LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */)
 {
+#ifndef NO_PLUGIN_STATE
 	XMLNodeList nodes;
 	XMLProperty *prop;
 	XMLNodeConstIterator iter;
@@ -412,6 +419,7 @@ LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */)
 	const char *port;
 	const char *data;
 	uint32_t port_id;
+#endif
 	LocaleGuard lg (X_("POSIX"));
 
 	if (node.name() != state_node_name()) {
@@ -419,6 +427,7 @@ LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */)
 		return -1;
 	}
 
+#ifndef NO_PLUGIN_STATE
 	nodes = node.children ("port");
 
 	for(iter = nodes.begin(); iter != nodes.end(); ++iter){
@@ -443,6 +452,7 @@ LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */)
 	}
 
 	latency_compute_run ();
+#endif
 
 	return 0;
 }
@@ -552,7 +562,7 @@ LadspaPlugin::connect_and_run (BufferSet& bufs,
 	cycles_t then = get_cycles ();
 
 	BufferSet& silent_bufs  = _session.get_silent_buffers(ChanCount(DataType::AUDIO, 1));
-	BufferSet& scratch_bufs = _session.get_silent_buffers(ChanCount(DataType::AUDIO, 1));
+	BufferSet& scratch_bufs = _session.get_scratch_buffers(ChanCount(DataType::AUDIO, 1));
 
 	uint32_t audio_in_index  = 0;
 	uint32_t audio_out_index = 0;
diff --git a/libs/ardour/panner_search_path.cc b/libs/ardour/lv2_bundled_search_path.cc
similarity index 70%
copy from libs/ardour/panner_search_path.cc
copy to libs/ardour/lv2_bundled_search_path.cc
index 63802ff..d8cd1c1 100644
--- a/libs/ardour/panner_search_path.cc
+++ b/libs/ardour/lv2_bundled_search_path.cc
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2007 Tim Mayberry
+    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
@@ -17,28 +17,24 @@
 
 */
 
+#include <iostream>
+
 #include <glibmm/miscutils.h>
 
-#include "ardour/panner_search_path.h"
+#include "ardour/lv2_bundled_search_path.h"
 #include "ardour/directory_names.h"
 #include "ardour/filesystem_paths.h"
 
-namespace {
-	const char * const panner_env_variable_name = "ARDOUR_PANNER_PATH";
-} // anonymous
-
 using namespace PBD;
 
 namespace ARDOUR {
 
 SearchPath
-panner_search_path ()
+lv2_bundled_search_path ()
 {
-	SearchPath spath(user_config_directory ());
-	spath += ardour_dll_directory ();
-	spath.add_subdirectory_to_paths(panner_dir_name);
+	SearchPath spath( ardour_dll_directory () );
+	spath.add_subdirectory_to_paths ("LV2");
 
-	spath += SearchPath(Glib::getenv(panner_env_variable_name));
 	return spath;
 }
 
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
index f7189be..bfa593a 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -31,6 +31,7 @@
 
 #include <boost/utility.hpp>
 
+#include "pbd/pathscanner.h"
 #include "pbd/compose.h"
 #include "pbd/error.h"
 #include "pbd/xml++.h"
@@ -46,6 +47,7 @@
 #include "ardour/types.h"
 #include "ardour/utils.h"
 #include "ardour/worker.h"
+#include "ardour/lv2_bundled_search_path.h"
 
 #include "i18n.h"
 #include <locale.h>
@@ -110,6 +112,8 @@ public:
 	LV2World ();
 	~LV2World ();
 
+	void load_bundled_plugins();
+
 	LilvWorld* world;
 
 	LilvNode* atom_AtomPort;
@@ -126,6 +130,7 @@ public:
 	LilvNode* lv2_InputPort;
 	LilvNode* lv2_OutputPort;
 	LilvNode* lv2_enumeration;
+	LilvNode* lv2_freewheeling;
 	LilvNode* lv2_inPlaceBroken;
 	LilvNode* lv2_integer;
 	LilvNode* lv2_reportsLatency;
@@ -137,6 +142,9 @@ public:
 	LilvNode* time_Position;
 	LilvNode* ui_GtkUI;
 	LilvNode* ui_external;
+
+private:
+	bool _bundle_checked;
 };
 
 static LV2World _world;
@@ -962,7 +970,7 @@ LV2Plugin::find_presets()
 				                               lilv_node_as_string(name))));
 		} else {
 			warning << string_compose(
-			    _("Plugin \"%1\% preset \"%2%\" is missing a label\n"),
+			    _("Plugin \"%1\" preset \"%2\" is missing a label\n"),
 			    lilv_node_as_string(lilv_plugin_get_uri(_impl->plugin)),
 			    lilv_node_as_string(preset)) << endmsg;
 		}
@@ -1225,6 +1233,8 @@ LV2Plugin::set_state(const XMLNode& node, int version)
 		return -1;
 	}
 
+#ifndef NO_PLUGIN_STATE
+
 	if (version < 3000) {
 		nodes = node.children("port");
 	} else {
@@ -1280,6 +1290,7 @@ LV2Plugin::set_state(const XMLNode& node, int version)
 	}
 
 	latency_compute_run();
+#endif
 
 	return Plugin::set_state(node, version);
 }
@@ -1336,6 +1347,17 @@ LV2Plugin::describe_parameter(Evoral::Parameter which)
 					lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) {
 			return X_("hidden");
 		}
+
+		if (lilv_port_has_property(_impl->plugin,
+					lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) {
+			return X_("hidden");
+		}
+
+		if (lilv_port_has_property(_impl->plugin,
+					lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_sampleRate)) {
+			return X_("hidden");
+		}
+
 		if (lilv_port_has_property(_impl->plugin,
 					lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) {
 			return X_("latency");
@@ -1629,7 +1651,7 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
 				}
 			} else if (!valid) {
 				// Nothing we understand or care about, connect to scratch
-				_ev_buffers[port_index] = silent_bufs.get_lv2_midi(
+				_ev_buffers[port_index] = scratch_bufs.get_lv2_midi(
 					(flags & PORT_INPUT), 0, (flags & PORT_EVENT));
 			}
 			buf = lv2_evbuf_get_buffer(_ev_buffers[port_index]);
@@ -1879,10 +1901,20 @@ LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** buf
 	return port;
 }
 
+static bool lv2_filter (const string& str, void *arg)
+{
+	/* Not a dotfile, has a prefix before a period, suffix is "lv2" */
+	
+	return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4));
+}
+
+
 LV2World::LV2World()
 	: world(lilv_world_new())
+	, _bundle_checked(false)
 {
 	lilv_world_load_all(world);
+
 	atom_AtomPort      = lilv_new_uri(world, LV2_ATOM__AtomPort);
 	atom_Chunk         = lilv_new_uri(world, LV2_ATOM__Chunk);
 	atom_Sequence      = lilv_new_uri(world, LV2_ATOM__Sequence);
@@ -1902,6 +1934,7 @@ LV2World::LV2World()
 	lv2_sampleRate     = lilv_new_uri(world, LV2_CORE__sampleRate);
 	lv2_toggled        = lilv_new_uri(world, LV2_CORE__toggled);
 	lv2_enumeration    = lilv_new_uri(world, LV2_CORE__enumeration);
+	lv2_freewheeling   = lilv_new_uri(world, LV2_CORE__freeWheeling);
 	midi_MidiEvent     = lilv_new_uri(world, LILV_URI_MIDI_EVENT);
 	rdfs_comment       = lilv_new_uri(world, LILV_NS_RDFS "comment");
 	rsz_minimumSize    = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize);
@@ -1919,6 +1952,7 @@ LV2World::~LV2World()
 	lilv_node_free(rdfs_comment);
 	lilv_node_free(midi_MidiEvent);
 	lilv_node_free(lv2_enumeration);
+	lilv_node_free(lv2_freewheeling);
 	lilv_node_free(lv2_toggled);
 	lilv_node_free(lv2_sampleRate);
 	lilv_node_free(lv2_reportsLatency);
@@ -1939,6 +1973,31 @@ LV2World::~LV2World()
 	lilv_node_free(atom_AtomPort);
 }
 
+void
+LV2World::load_bundled_plugins()
+{
+	if (!_bundle_checked) {
+		cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl;
+		PathScanner scanner;
+		vector<string *> *plugin_objects = scanner (ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true);
+		if (plugin_objects) {
+			for ( vector<string *>::iterator x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
+#ifdef WINDOWS
+				string uri = "file:///" + **x + "/";
+#else
+				string uri = "file://" + **x + "/";
+#endif
+				LilvNode *node = lilv_new_uri(world, uri.c_str());
+				lilv_world_load_bundle(world, node);
+				lilv_node_free(node);
+			}
+		}
+		delete (plugin_objects);
+
+		_bundle_checked = true;
+	}
+}
+
 LV2PluginInfo::LV2PluginInfo (const void* c_plugin)
 	: _c_plugin(c_plugin)
 {
@@ -1970,6 +2029,8 @@ LV2PluginInfo::load(Session& session)
 PluginInfoList*
 LV2PluginInfo::discover()
 {
+	_world.load_bundled_plugins();
+
 	PluginInfoList*    plugs   = new PluginInfoList;
 	const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
 
diff --git a/libs/ardour/lxvst_plugin.cc b/libs/ardour/lxvst_plugin.cc
old mode 100755
new mode 100644
diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc
index 38c5bb6..a7857f5 100644
--- a/libs/ardour/meter.cc
+++ b/libs/ardour/meter.cc
@@ -26,6 +26,7 @@
 #include "ardour/dB.h"
 #include "ardour/meter.h"
 #include "ardour/midi_buffer.h"
+#include "ardour/session.h"
 #include "ardour/rc_configuration.h"
 #include "ardour/runtime_functions.h"
 
@@ -36,8 +37,28 @@ using namespace ARDOUR;
 PBD::Signal0<void> Metering::Meter;
 
 PeakMeter::PeakMeter (Session& s, const std::string& name)
-    : Processor (s, string_compose ("meter-%1", name)) 
+    : Processor (s, string_compose ("meter-%1", name))
 {
+	Kmeterdsp::init(s.nominal_frame_rate());
+	Iec1ppmdsp::init(s.nominal_frame_rate());
+	Iec2ppmdsp::init(s.nominal_frame_rate());
+	Vumeterdsp::init(s.nominal_frame_rate());
+	_pending_active = true;
+	_meter_type = MeterPeak;
+}
+
+PeakMeter::~PeakMeter ()
+{
+	while (_kmeter.size() > 0) {
+		delete (_kmeter.back());
+		delete (_iec1meter.back());
+		delete (_iec2meter.back());
+		delete (_vumeter.back());
+		_kmeter.pop_back();
+		_iec1meter.pop_back();
+		_iec2meter.pop_back();
+		_vumeter.pop_back();
+	}
 }
 
 
@@ -45,6 +66,8 @@ PeakMeter::PeakMeter (Session& s, const std::string& name)
  * Input acceptance is lenient - the first n buffers from @a bufs will
  * be metered, where n was set by the last call to setup(), excess meters will
  * be set to 0.
+ *
+ * (runs in jack realtime context)
  */
 void
 PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
@@ -68,7 +91,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
 		for (MidiBuffer::iterator e = buf.begin(); e != buf.end(); ++e) {
 			const Evoral::MIDIEvent<framepos_t> ev(*e, false);
 			if (ev.is_note_on()) {
-				const float this_vel = log(ev.buffer()[2] / 127.0 * (M_E*M_E-M_E) + M_E) - 1.0;
+				const float this_vel = ev.buffer()[2] / 127.0;
 				if (this_vel > val) {
 					val = this_vel;
 				}
@@ -79,17 +102,29 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
 				}
 			}
 		}
-		_peak_power[n] = max (val, _peak_power[n]);
+		_peak_signal[n] = max (val, _peak_signal[n]);
 	}
 
 	// Meter audio in to the rest of the peaks
 	for (uint32_t i = 0; i < n_audio; ++i, ++n) {
-		_peak_power[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_power[n]);
+		_peak_signal[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_signal[n]);
+		if (_meter_type & (MeterKrms | MeterK20 | MeterK14)) {
+			_kmeter[i]->process(bufs.get_audio(i).data(), nframes);
+		}
+		if (_meter_type & (MeterIEC1DIN | MeterIEC1NOR)) {
+			_iec1meter[i]->process(bufs.get_audio(i).data(), nframes);
+		}
+		if (_meter_type & (MeterIEC2BBC | MeterIEC2EBU)) {
+			_iec2meter[i]->process(bufs.get_audio(i).data(), nframes);
+		}
+		if (_meter_type & MeterVU) {
+			_vumeter[i]->process(bufs.get_audio(i).data(), nframes);
+		}
 	}
 
 	// Zero any excess peaks
-	for (uint32_t i = n; i < _peak_power.size(); ++i) {
-		_peak_power[i] = 0.0f;
+	for (uint32_t i = n; i < _peak_signal.size(); ++i) {
+		_peak_signal[i] = 0.0f;
 	}
 
 	_active = _pending_active;
@@ -98,8 +133,15 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
 void
 PeakMeter::reset ()
 {
-	for (size_t i = 0; i < _peak_power.size(); ++i) {
-		_peak_power[i] = 0.0f;
+	for (size_t i = 0; i < _peak_signal.size(); ++i) {
+		_peak_signal[i] = 0.0f;
+	}
+
+	for (size_t n = 0; n < _kmeter.size(); ++n) {
+		_kmeter[n]->reset();
+		_iec1meter[n]->reset();
+		_iec2meter[n]->reset();
+		_vumeter[n]->reset();
 	}
 }
 
@@ -108,11 +150,22 @@ PeakMeter::reset_max ()
 {
 	for (size_t i = 0; i < _max_peak_power.size(); ++i) {
 		_max_peak_power[i] = -INFINITY;
+		_max_peak_signal[i] = 0;
+	}
+
+	const size_t n_midi  = min (_peak_signal.size(), (size_t) current_meters.n_midi());
+
+	for (size_t n = 0; n < _peak_signal.size(); ++n) {
+		if (n < n_midi) {
+			_visible_peak_power[n] = 0;
+		} else {
+			_visible_peak_power[n] = -INFINITY;
+		}
 	}
 }
 
 bool
-PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	out = in;
 	return true;
@@ -135,7 +188,21 @@ PeakMeter::configure_io (ChanCount in, ChanCount out)
 void
 PeakMeter::reflect_inputs (const ChanCount& in)
 {
+	for (uint32_t i = in.n_total(); i < current_meters.n_total(); ++i) {
+		if (i < _peak_signal.size()) {
+			_peak_signal[i] = 0.0f;
+		}
+	}
+	for (uint32_t i = in.n_audio(); i < current_meters.n_audio(); ++i) {
+		if (i >= _kmeter.size()) continue;
+		_kmeter[i]->reset();
+		_iec1meter[i]->reset();
+		_iec2meter[i]->reset();
+		_vumeter[i]->reset();
+	}
+
 	current_meters = in;
+	reset_max();
 
 	ConfigurationChanged (in, in); /* EMIT SIGNAL */
 }
@@ -144,22 +211,51 @@ void
 PeakMeter::reset_max_channels (const ChanCount& chn)
 {
 	uint32_t const limit = chn.n_total();
+	const size_t n_audio = chn.n_audio();
 
-	while (_peak_power.size() > limit) {
-		_peak_power.pop_back();
+	while (_peak_signal.size() > limit) {
+		_peak_signal.pop_back();
 		_visible_peak_power.pop_back();
+		_max_peak_signal.pop_back();
 		_max_peak_power.pop_back();
 	}
 
-	while (_peak_power.size() < limit) {
-		_peak_power.push_back(0);
+	while (_peak_signal.size() < limit) {
+		_peak_signal.push_back(0);
 		_visible_peak_power.push_back(minus_infinity());
+		_max_peak_signal.push_back(0);
 		_max_peak_power.push_back(minus_infinity());
 	}
 
-	assert(_peak_power.size() == limit);
+	assert(_peak_signal.size() == limit);
 	assert(_visible_peak_power.size() == limit);
+	assert(_max_peak_signal.size() == limit);
 	assert(_max_peak_power.size() == limit);
+
+	/* alloc/free other audio-only meter types. */
+	while (_kmeter.size() > n_audio) {
+		delete (_kmeter.back());
+		delete (_iec1meter.back());
+		delete (_iec2meter.back());
+		delete (_vumeter.back());
+		_kmeter.pop_back();
+		_iec1meter.pop_back();
+		_iec2meter.pop_back();
+		_vumeter.pop_back();
+	}
+	while (_kmeter.size() < n_audio) {
+		_kmeter.push_back(new Kmeterdsp());
+		_iec1meter.push_back(new Iec1ppmdsp());
+		_iec2meter.push_back(new Iec2ppmdsp());
+		_vumeter.push_back(new Vumeterdsp());
+	}
+	assert(_kmeter.size() == n_audio);
+	assert(_iec1meter.size() == n_audio);
+	assert(_iec2meter.size() == n_audio);
+	assert(_vumeter.size() == n_audio);
+
+	reset();
+	reset_max();
 }
 
 /** To be driven by the Meter signal from IO.
@@ -174,21 +270,55 @@ PeakMeter::meter ()
 		return;
 	}
 
-	assert(_visible_peak_power.size() == _peak_power.size());
+	// TODO block this thread while PeakMeter::reset_max_channels() is
+	// reallocating channels.
+	// (may happen with Session > New: old session not yet closed,
+	// meter-thread still active while new one is initializing and
+	// maybe on other occasions, too)
+	if (   (_visible_peak_power.size() != _peak_signal.size())
+			|| (_max_peak_power.size()     != _peak_signal.size())
+			|| (_max_peak_signal.size()    != _peak_signal.size())
+			 ) {
+		return;
+	}
+
+	const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ());
+	const size_t n_midi  = min (_peak_signal.size(), (size_t) current_meters.n_midi());
 
-	const size_t limit = min (_peak_power.size(), (size_t) current_meters.n_total ());
+	/* 0.01f ^= 100 Hz update rate */
+	const float midi_meter_falloff = Config->get_meter_falloff() * 0.01f;
+	/* kmeters: 24dB / 2 sec */
+	const float audio_meter_falloff = (_meter_type & (MeterK20 | MeterK14)) ? 0.12f : midi_meter_falloff;
 
 	for (size_t n = 0; n < limit; ++n) {
 
 		/* grab peak since last read */
 
-		float new_peak = _peak_power[n]; /* XXX we should use atomic exchange from here ... */
-		_peak_power[n] = 0;              /* ... to here */
+		float new_peak = _peak_signal[n]; /* XXX we should use atomic exchange from here ... */
+		_peak_signal[n] = 0;              /* ... to here */
+
+		if (n < n_midi) {
+			_max_peak_power[n] = -INFINITY; // std::max (new_peak, _max_peak_power[n]); // XXX
+			_max_peak_signal[n] = 0;
+			if (midi_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) {
+				;
+			} else {
+				/* empirical algorithm WRT to audio falloff times */
+				new_peak = _visible_peak_power[n] - sqrt(_visible_peak_power[n] * midi_meter_falloff * 0.0002f);
+				if (new_peak < (1.0 / 512.0)) new_peak = 0;
+			}
+			_visible_peak_power[n] = new_peak;
+			continue;
+		}
+
+		/* AUDIO */
 
 		/* compute new visible value using falloff */
 
+		_max_peak_signal[n] = std::max(new_peak, _max_peak_signal[n]);
+
 		if (new_peak > 0.0) {
-			new_peak = fast_coefficient_to_dB (new_peak);
+			new_peak = accurate_coefficient_to_dB (new_peak);
 		} else {
 			new_peak = minus_infinity();
 		}
@@ -197,16 +327,111 @@ PeakMeter::meter ()
 
 		_max_peak_power[n] = std::max (new_peak, _max_peak_power[n]);
 
-		if (Config->get_meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) {
+		if (audio_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) {
 			_visible_peak_power[n] = new_peak;
 		} else {
 			// do falloff
-			new_peak = _visible_peak_power[n] - (Config->get_meter_falloff() * 0.01f);
+			new_peak = _visible_peak_power[n] - (audio_meter_falloff);
 			_visible_peak_power[n] = std::max (new_peak, -INFINITY);
 		}
 	}
 }
 
+#define CHECKSIZE(MTR) (n < MTR.size() + n_midi && n >= n_midi)
+
+float
+PeakMeter::meter_level(uint32_t n, MeterType type) {
+	switch (type) {
+		case MeterKrms:
+		case MeterK20:
+		case MeterK14:
+			{
+				const uint32_t n_midi = current_meters.n_midi();
+				if (CHECKSIZE(_kmeter)) {
+					return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read());
+				}
+			}
+			break;
+		case MeterIEC1DIN:
+		case MeterIEC1NOR:
+			{
+				const uint32_t n_midi = current_meters.n_midi();
+				if (CHECKSIZE(_iec1meter)) {
+					return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read());
+				}
+			}
+			break;
+		case MeterIEC2BBC:
+		case MeterIEC2EBU:
+			{
+				const uint32_t n_midi = current_meters.n_midi();
+				if (CHECKSIZE(_iec2meter)) {
+					return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read());
+				}
+			}
+			break;
+		case MeterVU:
+			{
+				const uint32_t n_midi = current_meters.n_midi();
+				if (CHECKSIZE(_vumeter)) {
+					return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read());
+				}
+			}
+			break;
+		case MeterPeak:
+			return peak_power(n);
+		case MeterMaxSignal:
+			if (n < _max_peak_signal.size()) {
+				return _max_peak_signal[n];
+			}
+			break;
+		default:
+		case MeterMaxPeak:
+			if (n < _max_peak_power.size()) {
+				return _max_peak_power[n];
+			}
+			break;
+	}
+	return minus_infinity();
+}
+
+void
+PeakMeter::set_type(MeterType t)
+{
+	if (t == _meter_type) {
+		return;
+	}
+
+	_meter_type = t;
+
+	if (t & (MeterKrms | MeterK20 | MeterK14)) {
+		const size_t n_audio = current_meters.n_audio();
+		for (size_t n = 0; n < n_audio; ++n) {
+			_kmeter[n]->reset();
+		}
+	}
+	if (t & (MeterIEC1DIN | MeterIEC1NOR)) {
+		const size_t n_audio = current_meters.n_audio();
+		for (size_t n = 0; n < n_audio; ++n) {
+			_iec1meter[n]->reset();
+		}
+	}
+	if (t & (MeterIEC2BBC | MeterIEC2EBU)) {
+		const size_t n_audio = current_meters.n_audio();
+		for (size_t n = 0; n < n_audio; ++n) {
+			_iec2meter[n]->reset();
+		}
+	}
+	if (t & MeterVU) {
+		const size_t n_audio = current_meters.n_audio();
+		for (size_t n = 0; n < n_audio; ++n) {
+			_vumeter[n]->reset();
+		}
+	}
+
+	TypeChanged(t);
+}
+
 XMLNode&
 PeakMeter::state (bool full_state)
 {
@@ -214,5 +439,3 @@ PeakMeter::state (bool full_state)
 	node.add_property("type", "meter");
 	return node;
 }
-
-
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 9c11e81..489a84e 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -517,6 +517,20 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
 	return 0;
 }
 
+frameoffset_t
+MidiDiskstream::calculate_playback_distance (pframes_t nframes)
+{
+	frameoffset_t playback_distance = nframes;
+
+	/* XXX: should be doing varispeed stuff once it's implemented in ::process() above */
+
+	if (_actual_speed < 0.0) {
+		return -playback_distance;
+	} else {
+		return playback_distance;
+	}
+}
+
 bool
 MidiDiskstream::commit (framecnt_t playback_distance)
 {
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index f7f9ff7..f88c331 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -319,6 +319,12 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
 {
 	Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
 	if (!lm.locked()) {
+		boost::shared_ptr<MidiDiskstream> diskstream = midi_diskstream();
+		framecnt_t playback_distance = diskstream->calculate_playback_distance(nframes);
+		if (can_internal_playback_seek(llabs(playback_distance))) {
+			/* TODO should declick, and/or note-off */
+			internal_playback_seek(playback_distance);
+		}
 		return 0;
 	}
 
@@ -330,6 +336,9 @@ 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())) {
+			_meter->reset();
+		}
 		return 0;
 	}
 
@@ -350,11 +359,11 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
 		return dret;
 	}
 
-	BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
+	BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
 
 	fill_buffers_with_input (bufs, _input, nframes);
 
-	if (_meter_point == MeterInput) {
+	if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
 		_meter->run (bufs, start_frame, end_frame, nframes, true);
 	}
 
diff --git a/libs/ardour/monitor_processor.cc b/libs/ardour/monitor_processor.cc
index e55428b..ed06647 100644
--- a/libs/ardour/monitor_processor.cc
+++ b/libs/ardour/monitor_processor.cc
@@ -355,7 +355,7 @@ MonitorProcessor::configure_io (ChanCount in, ChanCount out)
 }
 
 bool
-MonitorProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+MonitorProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	out = in;
 	return true;
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index c5d52f7..bb79801 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -250,7 +250,7 @@ Playlist::Playlist (boost::shared_ptr<const Playlist> other, framepos_t start, f
 		plist.add (Properties::layer, region->layer());
 		plist.add (Properties::layering_index, region->layering_index());
 
-		new_region = RegionFactory::RegionFactory::create (region, plist);
+		new_region = RegionFactory::create (region, plist);
 
 		add_region_internal (new_region, position);
 	}
@@ -284,7 +284,7 @@ Playlist::copy_regions (RegionList& newlist) const
 	RegionReadLock rlock (const_cast<Playlist *> (this));
 
 	for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) {
-		newlist.push_back (RegionFactory::RegionFactory::create (*i, true));
+		newlist.push_back (RegionFactory::create (*i, true));
 	}
 }
 
diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc
index 5719847..9b2170c 100644
--- a/libs/ardour/plugin.cc
+++ b/libs/ardour/plugin.cc
@@ -68,6 +68,11 @@ using namespace PBD;
 
 namespace ARDOUR { class AudioEngine; }
 
+#ifdef NO_PLUGIN_STATE
+static bool seen_get_state_message = false;
+static bool seen_set_state_message = false;
+#endif
+
 bool
 PluginInfo::is_instrument () const
 {
@@ -299,18 +304,28 @@ Plugin::resolve_midi ()
 	_have_pending_stop_events = true;
 }
 
+
 vector<Plugin::PresetRecord>
 Plugin::get_presets ()
 {
+	vector<PresetRecord> p;
+
+#ifndef NO_PLUGIN_STATE
 	if (!_have_presets) {
 		find_presets ();
 		_have_presets = true;
 	}
 
-	vector<PresetRecord> p;
 	for (map<string, PresetRecord>::const_iterator i = _presets.begin(); i != _presets.end(); ++i) {
 		p.push_back (i->second);
 	}
+#else
+	if (!seen_set_state_message) {
+		info << string_compose (_("Plugin presets are not supported in this build of %1. Consider paying for a full version"),
+					PROGRAM_NAME)
+		     << endmsg;
+	}
+#endif
 
 	return p;
 }
@@ -376,7 +391,17 @@ Plugin::get_state ()
 	root->add_property (X_("last-preset-label"), _last_preset.label);
 	root->add_property (X_("parameter-changed-since-last-preset"), _parameter_changed_since_last_preset ? X_("yes") : X_("no"));
 
+#ifndef NO_PLUGIN_STATE	
 	add_state (root);
+#else
+	if (!seen_get_state_message) {
+		info << string_compose (_("Saving plugin settings is not supported in this build of %1. Consider paying for the full version"),
+					PROGRAM_NAME)
+		     << endmsg;
+		seen_get_state_message = true;
+	}
+#endif
+
 	return *root;
 }
 
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index 23cebf4..b191cf4 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -145,7 +145,7 @@ 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());
+		out.set_midi (out.n_midi() * _plugins.size() + midi_bypass.n_midi());
 		return out;
 	}
 }
@@ -448,7 +448,7 @@ PluginInsert::silence (framecnt_t nframes)
 	}
 
 	for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
-		(*i)->connect_and_run (_session.get_silent_buffers ((*i)->get_info()->n_inputs), in_map, out_map, nframes, 0);
+		(*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
 	}
 }
 
@@ -465,7 +465,6 @@ PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end
 		}
 
 	} else {
-
 		if (has_no_audio_inputs()) {
 
 			/* silence all (audio) outputs. Should really declick
@@ -704,7 +703,7 @@ PluginInsert::configure_io (ChanCount in, ChanCount out)
  *  @return true if the given IO configuration can be supported.
  */
 bool
-PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	return private_can_support_io_configuration (in, out).method != Impossible;
 }
@@ -714,9 +713,11 @@ PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
  *  it can be.
  */
 PluginInsert::Match
-PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCount& out) const
+PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out)
 {
 	PluginInfoPtr info = _plugins.front()->get_info();
+	ChanCount in; in += inx;
+	midi_bypass.reset();
 
 	if (info->reconfigurable_io()) {
 		/* Plugin has flexible I/O, so delegate to it */
@@ -731,6 +732,15 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo
 	ChanCount inputs  = info->n_inputs;
 	ChanCount outputs = info->n_outputs;
 
+	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);
+	}
+	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()));
+		in.set(DataType::MIDI, 0);
+	}
+
 	bool no_inputs = true;
 	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
 		if (inputs.get (*t) != 0) {
@@ -741,13 +751,13 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo
 
 	if (no_inputs) {
 		/* no inputs so we can take any input configuration since we throw it away */
-		out = outputs;
+		out = outputs + midi_bypass;
 		return Match (NoInputs, 1);
 	}
 
 	/* Plugin inputs match requested inputs exactly */
 	if (inputs == in) {
-		out = outputs;
+		out = outputs + midi_bypass;
 		return Match (ExactMatch, 1);
 	}
 
@@ -789,6 +799,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo
 		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
 			out.set (*t, outputs.get(*t) * f);
 		}
+		out += midi_bypass;
 		return Match (Replicate, f);
 	}
 
@@ -812,7 +823,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo
 	}
 
 	if (can_split) {
-		out = outputs;
+		out = outputs + midi_bypass;
 		return Match (Split, 1);
 	}
 
@@ -836,10 +847,11 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo
 	}
 
 	if (could_hide && !cannot_hide) {
-		out = outputs;
+		out = outputs + midi_bypass;
 		return Match (Hide, 1, hide_channels);
 	}
 
+	midi_bypass.reset();
 	return Match (Impossible, 0);
 }
 
@@ -882,7 +894,12 @@ PluginInsert::set_control_ids (const XMLNode& node, int version)
 
 			if ((prop = (*iter)->property (X_("parameter"))) != 0) {
 				uint32_t p = atoi (prop->value());
+
+				/* this may create the new controllable */
+
 				boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
+
+#ifndef NO_PLUGIN_STATE
 				if (!c) {
 					continue;
 				}
@@ -890,6 +907,7 @@ PluginInsert::set_control_ids (const XMLNode& node, int version)
 				if (ac) {
 					ac->set_state (**iter, version);
 				}
+#endif
 			}
 		}
 	}
diff --git a/libs/ardour/po/de.po b/libs/ardour/po/de.po
index 579d525..564cafd 100644
--- a/libs/ardour/po/de.po
+++ b/libs/ardour/po/de.po
@@ -6,8 +6,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-06-11 08:49-0400\n"
-"PO-Revision-Date: 2013-02-05 19:52+0100\n"
+"POT-Creation-Date: 2013-07-17 11:09+0200\n"
+"PO-Revision-Date: 2013-07-23 15:04+0200\n"
 "Last-Translator: Edgar Aichinger <edogawa at aon.at>\n"
 "Language-Team: German <ardour-dev at lists.ardour.org>\n"
 "Language: de\n"
@@ -218,7 +218,7 @@ msgstr ""
 msgid "Connect session to engine"
 msgstr "Verbinde Projekt mit Engine"
 
-#: audioengine.cc:844
+#: audioengine.cc:843
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
@@ -226,7 +226,7 @@ msgstr ""
 "Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/"
 "Busnamen"
 
-#: audioengine.cc:846 session.cc:1698
+#: audioengine.cc:845 session.cc:1698
 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."
@@ -234,35 +234,35 @@ 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."
 
-#: audioengine.cc:849
+#: audioengine.cc:848
 msgid "AudioEngine: cannot register port \"%1\": %2"
 msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren"
 
-#: audioengine.cc:879
+#: audioengine.cc:878
 msgid "unable to create port: %1"
 msgstr "kann Port: %1 nicht erzeugen"
 
-#: audioengine.cc:933
+#: audioengine.cc:932
 msgid "connect called before engine was started"
 msgstr "Aufruf von connect vor dem Start der Engine"
 
-#: audioengine.cc:959
+#: audioengine.cc:958
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden"
 
-#: audioengine.cc:974 audioengine.cc:1005
+#: audioengine.cc:973 audioengine.cc:1004
 msgid "disconnect called before engine was started"
 msgstr "Aufruf von disconnect vor dem Start der Engine"
 
-#: audioengine.cc:1053
+#: audioengine.cc:1052
 msgid "get_port_by_name() called before engine was started"
 msgstr "Aufruf von get_port_by_name() vor dem Start der Engine"
 
-#: audioengine.cc:1105
+#: audioengine.cc:1104
 msgid "get_ports called before engine was started"
 msgstr "Aufruf von get_ports vor dem Start der Engine"
 
-#: audioengine.cc:1428
+#: audioengine.cc:1427
 msgid "failed to connect to JACK"
 msgstr "Verbindung zu JACK fehlgeschlagen"
 
@@ -316,8 +316,8 @@ msgstr "AudioSource: kann Pfad für Peaks (b) \"%1\" nicht öffnen (%2)"
 msgid ""
 "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
 msgstr ""
-"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht lesen"
-"(%5)"
+"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht "
+"lesen(%5)"
 
 #: audiosource.cc:667
 msgid "%1: could not write read raw data for peak computation (%2)"
@@ -971,21 +971,21 @@ msgstr "R"
 msgid "%d"
 msgstr "%d"
 
-#: ladspa_plugin.cc:87
+#: ladspa_plugin.cc:88
 msgid "LADSPA: module has no descriptor function."
 msgstr "LADSPA: Modul hat keine Beschreibungsfunktion"
 
-#: ladspa_plugin.cc:92
+#: ladspa_plugin.cc:93
 msgid "LADSPA: plugin has gone away since discovery!"
 msgstr "LADSPA: Plugin ist nicht mehr auffindbar!"
 
-#: ladspa_plugin.cc:99
+#: ladspa_plugin.cc:100
 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
 msgstr ""
 "LADSPA: \"%1\" kann nicht verwendet werdeen, da es kein \"inplace processing"
 "\" beherrscht"
 
-#: ladspa_plugin.cc:296
+#: ladspa_plugin.cc:297
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
@@ -993,35 +993,35 @@ msgstr ""
 "Falsche Parameterzahl für Plugin \"%1\". Das auf eine Änderung im Plugin-"
 "Design hindeuten, und Presets sind eventuell ungültig"
 
-#: ladspa_plugin.cc:373 ladspa_plugin.cc:418
+#: ladspa_plugin.cc:376 ladspa_plugin.cc:426
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr "Schlechter Knoten an LadspaPlugin::set_state gesendet"
 
-#: ladspa_plugin.cc:386 ladspa_plugin.cc:431
+#: ladspa_plugin.cc:391 ladspa_plugin.cc:440
 msgid "LADSPA: no ladspa port number"
 msgstr "LADSPA: keine LADSPA-Portnummer"
 
-#: ladspa_plugin.cc:392 ladspa_plugin.cc:437
+#: ladspa_plugin.cc:397 ladspa_plugin.cc:446
 msgid "LADSPA: no ladspa port data"
 msgstr "LADSPA: keine LADSPA-Portdaten"
 
-#: ladspa_plugin.cc:707
+#: ladspa_plugin.cc:717
 msgid "LADSPA: cannot load module from \"%1\""
 msgstr "LADSPA: kann Modul nicht aus \"%1\" laden"
 
-#: ladspa_plugin.cc:817
+#: ladspa_plugin.cc:827
 msgid "Could not locate HOME.  Preset not removed."
 msgstr "Konnte HOME nicht eruieren. Preset nicht entfernt."
 
-#: ladspa_plugin.cc:854 ladspa_plugin.cc:860
+#: ladspa_plugin.cc:864 ladspa_plugin.cc:870
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr "Konnte %1 nicht erzeugen. Preset nicht gesichert. (%2)"
 
-#: ladspa_plugin.cc:867
+#: ladspa_plugin.cc:877
 msgid "Error saving presets file %1."
 msgstr "Fehler beim Sichern der Preset-Datei %1."
 
-#: ladspa_plugin.cc:905
+#: ladspa_plugin.cc:915
 msgid "Could not locate HOME.  Preset not saved."
 msgstr "Konnte HOME nicht eruieren. Preset nicht gesichert."
 
@@ -1368,23 +1368,39 @@ msgstr ""
 "Konnte die Wiedergabeliste nicht aus den Quelldaten des Projekts "
 "konstruieren!"
 
+#: plugin.cc:324
+msgid ""
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"full version"
+msgstr ""
+"Pluginpresets werden in diesem %1-Binärpaket nicht unterstützt. Erwägen Sie, "
+"für die Vollversion zu bezahlen"
+
+#: plugin.cc:398
+msgid ""
+"Saving plugin settings is not supported in this build of %1. Consider paying "
+"for the full version"
+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:599
 msgid "programming error: "
 msgstr "Programmierfehler:"
 
-#: plugin_insert.cc:908
+#: plugin_insert.cc:914
 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:923
+#: plugin_insert.cc:929
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr "Unbekannter Plugintyp %1 im Einfüge-Status des Plugins"
 
-#: plugin_insert.cc:951
+#: plugin_insert.cc:957
 msgid "Plugin has no unique ID field"
 msgstr "Das Plugin hat kein Feld für die eindeutige ID"
 
-#: plugin_insert.cc:960
+#: plugin_insert.cc:966
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
@@ -1392,15 +1408,15 @@ msgstr ""
 "Referenz auf ein unbekanntes Plugin (\"%1\") gefunden.\n"
 "Vielleicht wurde es seit der letzten Verwendung entfernt oder verschoben."
 
-#: plugin_insert.cc:1076
+#: plugin_insert.cc:1082
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr "PluginInsert: Auto: keine LADSPA Portnummer"
 
-#: plugin_insert.cc:1083
+#: plugin_insert.cc:1089
 msgid "PluginInsert: Auto: port id out of range"
 msgstr "PluginInsert: Auto: Port-ID Bereichsüberschreitung"
 
-#: plugin_insert.cc:1119
+#: plugin_insert.cc:1125
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 "PluginInsert: automatisierbares Kontrollelement %1 nicht gefunden - ignoriert"
@@ -1550,23 +1566,23 @@ msgstr "Import: Fehler in src_new() : %1"
 msgid "return %1"
 msgstr "Rückgabewert: %1"
 
-#: route.cc:1100 route.cc:2550
+#: route.cc:1101 route.cc:2557
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr "unbekannter Prozessortyp \"%1\"; ignoriert"
 
-#: route.cc:1112
+#: route.cc:1113
 msgid "processor could not be created. Ignored."
 msgstr "Prozessor konnte nicht erzeugt werden. Ignoriert."
 
-#: route.cc:1983 route.cc:2203
+#: route.cc:1986 route.cc:2210
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr "Schlechter Knoten an Route::set_state() gesendet [%1]"
 
-#: route.cc:2042
+#: route.cc:2045
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr "Pannerziel-Status für Route (%1) ohne Panner gefunden!"
 
-#: route.cc:2106 route.cc:2110 route.cc:2317 route.cc:2321
+#: route.cc:2113 route.cc:2117 route.cc:2324 route.cc:2328
 msgid "badly formed order key string in state file! [%1] ... ignored."
 msgstr ""
 "schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge in "
@@ -1857,18 +1873,17 @@ msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)"
 msgid "Session: cannot create Playlist from XML description."
 msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen"
 
-#: session_process.cc:135
+#: session_process.cc:133
 msgid "Session: error in no roll for %1"
 msgstr "Session: Fehler in no_roll für %1"
 
-#: session_process.cc:1160
+#: session_process.cc:1158
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)"
 
 #: session_state.cc:139
-#, fuzzy
 msgid "Could not use path %1 (%2)"
-msgstr "Konnte Pfad %1 nicht benutzen (%s)"
+msgstr "Konnte Pfad %1 nicht benutzen (%2)"
 
 #: session_state.cc:267
 msgid "solo cut control (dB)"
@@ -2406,7 +2421,7 @@ msgstr ""
 msgid "attempt to write a non-writable audio file source (%1)"
 msgstr "Versuch, in eine schreibgeschützte Audio-Dateiquelle zu schreiben (%1)"
 
-#: sndfilesource.cc:396 utils.cc:497 utils.cc:521 utils.cc:535 utils.cc:554
+#: sndfilesource.cc:396 utils.cc:507 utils.cc:531 utils.cc:545 utils.cc:564
 msgid "programming error: %1 %2"
 msgstr "Programmierfehler: %1 %2"
 
@@ -2672,11 +2687,11 @@ msgstr "M-Clock"
 msgid "LTC"
 msgstr "LTC"
 
-#: utils.cc:589
+#: utils.cc:599
 msgid "programming error: unknown native header format: %1"
 msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1"
 
-#: utils.cc:604
+#: utils.cc:614
 msgid "cannot open directory %1 (%2)"
 msgstr "kann Verzeichnis %1 nicht öffnen (%2)"
 
diff --git a/libs/ardour/po/ru.po b/libs/ardour/po/ru.po
index ffc5d1c..81ed0e4 100644
--- a/libs/ardour/po/ru.po
+++ b/libs/ardour/po/ru.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libardour 3\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-06-11 08:49-0400\n"
-"PO-Revision-Date: 2013-01-05 12:34+0300\n"
+"POT-Creation-Date: 2013-06-14 03:23+0400\n"
+"PO-Revision-Date: 2013-06-14 02:14+0300\n"
 "Last-Translator: Александр Прокудин <alexandre.prokoudine at gmail.com>\n"
 "Language-Team: русский <>\n"
 "Language: \n"
@@ -18,6 +18,7 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); 10<=4 && (n%100<10 || n"
 "%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 1.5.4\n"
 
 #: amp.cc:60 automatable.cc:158
 msgid "Fader"
@@ -786,7 +787,6 @@ msgid "Track %1 of %2 contained no usable MIDI data"
 msgstr ""
 
 #: import.cc:453
-#, fuzzy
 msgid "MIDI file %1 was not readable (no reason available)"
 msgstr "MIDI-файл %1 нечитаем по неизвестной причине"
 
@@ -1755,9 +1755,8 @@ msgid "Programming error: illegal event type in process_event (%1)"
 msgstr ""
 
 #: session_state.cc:139
-#, fuzzy
 msgid "Could not use path %1 (%2)"
-msgstr "Cannot expand path %1 (%2)"
+msgstr "Не удалось использовать расположение  %1 (%2)"
 
 #: session_state.cc:267
 msgid "solo cut control (dB)"
@@ -1769,7 +1768,7 @@ msgstr "Сброс удалённого управления"
 
 #: session_state.cc:385
 msgid "Session loading complete"
-msgstr ""
+msgstr "Загрузка сеанса завершена"
 
 #: session_state.cc:452
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
@@ -1809,7 +1808,7 @@ msgstr "Session: cannot create session folder \"%1\" (%2)"
 
 #: session_state.cc:548
 msgid "Could not open %1 for writing session template"
-msgstr ""
+msgstr "Не удалось открыть %1 для записи шаблона сеанса"
 
 #: session_state.cc:554
 msgid "Could not open session template %1 for reading"
@@ -1853,7 +1852,7 @@ msgstr ""
 
 #: session_state.cc:890
 msgid "%1: session file \"%2\" doesn't exist!"
-msgstr ""
+msgstr "%1: файл сеанса «%2» не существует!"
 
 #: session_state.cc:902
 msgid "Could not understand session file %1"
@@ -2135,7 +2134,7 @@ msgstr ""
 
 #: smf_source.cc:410
 msgid "cannot open MIDI file %1 for write"
-msgstr ""
+msgstr "не удалось открыть MIDI-файл %2 для записи"
 
 #: sndfile_helpers.cc:32
 msgid "WAV"
@@ -2413,15 +2412,15 @@ msgstr ""
 
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
-msgstr ""
+msgstr "Карта темпа"
 
 #: tempo_map_importer.cc:60
 msgid "Tempo Map"
-msgstr ""
+msgstr "Карта темпа"
 
 #: tempo_map_importer.cc:80
 msgid "Tempo marks: "
-msgstr ""
+msgstr "Метки темпа:"
 
 #: tempo_map_importer.cc:80
 msgid ""
diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc
index c139274..411d8d1 100644
--- a/libs/ardour/port_insert.cc
+++ b/libs/ardour/port_insert.cc
@@ -266,7 +266,7 @@ PortInsert::configure_io (ChanCount in, ChanCount out)
 }
 
 bool
-PortInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+PortInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	out = in;
 	return true;
diff --git a/libs/ardour/process_thread.cc b/libs/ardour/process_thread.cc
index e10ccf1..d4a3d2f 100644
--- a/libs/ardour/process_thread.cc
+++ b/libs/ardour/process_thread.cc
@@ -90,7 +90,7 @@ ProcessThread::get_silent_buffers (ChanCount count)
 }
 
 BufferSet&
-ProcessThread::get_scratch_buffers (ChanCount count)
+ProcessThread::get_scratch_buffers (ChanCount count, bool silence)
 {
         ThreadBuffers* tb = _private_thread_buffers.get();
         assert (tb);
@@ -105,6 +105,41 @@ ProcessThread::get_scratch_buffers (ChanCount count)
 		sb->set_count (sb->available());
 	}
 
+	if (silence) {
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			for (uint32_t i = 0; i < sb->count().get(*t); ++i) {
+				sb->get(*t, i).clear();
+			}
+		}
+	}
+
+	return *sb;
+}
+
+BufferSet&
+ProcessThread::get_route_buffers (ChanCount count, bool silence)
+{
+	ThreadBuffers* tb = _private_thread_buffers.get();
+	assert (tb);
+
+	BufferSet* sb = tb->route_buffers;
+	assert (sb);
+
+	if (count != ChanCount::ZERO) {
+		assert(sb->available() >= count);
+		sb->set_count (count);
+	} else {
+		sb->set_count (sb->available());
+	}
+
+	if (silence) {
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			for (uint32_t i = 0; i < sb->count().get(*t); ++i) {
+				sb->get(*t, i).clear();
+			}
+		}
+	}
+
 	return *sb;
 }
 
diff --git a/libs/ardour/return.cc b/libs/ardour/return.cc
index 921be6a..4f9e8b9 100644
--- a/libs/ardour/return.cc
+++ b/libs/ardour/return.cc
@@ -136,7 +136,7 @@ Return::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pfra
 }
 
 bool
-Return::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+Return::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	out = in + _input->n_ports();
 	return true;
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 29e778e..2e1517f 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -83,6 +83,7 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
 	, _flags (flg)
 	, _pending_declick (true)
 	, _meter_point (MeterPostFader)
+	, _meter_type (MeterPeak)
 	, _self_solo (false)
 	, _soloed_by_others_upstream (0)
 	, _soloed_by_others_downstream (0)
@@ -97,9 +98,13 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
 	, _default_type (default_type)
 	, _remote_control_id (0)
 	, _in_configure_processors (false)
+	, _initial_io_setup (false)
 	, _custom_meter_position_noted (false)
 	, _last_custom_meter_was_at_end (false)
 {
+	if (is_master()) {
+		_meter_type = MeterK20;
+	}
 	processor_max_streams.reset();
 }
 
@@ -132,6 +137,7 @@ Route::init ()
 	_input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
 
 	_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));
 
 	/* add amp processor  */
 
@@ -539,11 +545,10 @@ Route::process_output_buffers (BufferSet& bufs,
 			if (bufs.count() != (*i)->input_streams()) {
 				DEBUG_TRACE (
 					DEBUG::Processors, string_compose (
-						"%1 bufs = %2 input for %3 = %4\n",
+						"input port mismatch %1 bufs = %2 input for %3 = %4\n",
 						_name, bufs.count(), (*i)->name(), (*i)->input_streams()
 						)
 					);
-				continue;
 			}
 		}
 #endif
@@ -567,7 +572,7 @@ void
 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
 {
 	assert (is_monitor());
-	BufferSet& bufs (_session.get_scratch_buffers (n_process_buffers()));
+	BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
 	passthru (bufs, start_frame, end_frame, nframes, declick);
 }
 
@@ -593,7 +598,7 @@ Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
 void
 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
 {
-	BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
+	BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
 
 	bufs.set_count (_input->n_ports());
 	write_out_of_band_data (bufs, start_frame, end_frame, nframes);
@@ -1650,7 +1655,8 @@ Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
 
 		if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
 			DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
-			break;
+			DEBUG_TRACE (DEBUG::Processors, "}\n");
+			return list<pair<ChanCount, ChanCount> > ();
 		}
 
 		if ((*p)->can_support_io_configuration(in, out)) {
@@ -1700,6 +1706,9 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
 	}
 
 	ChanCount out;
+	bool seen_mains_out = false;
+	processor_out_streams = _input->n_ports();
+	processor_max_streams.reset();
 
 	list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
 	for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
@@ -1712,8 +1721,21 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
 		processor_max_streams = ChanCount::max(processor_max_streams, c->first);
 		processor_max_streams = ChanCount::max(processor_max_streams, c->second);
 		out = c->second;
+
+		if (boost::dynamic_pointer_cast<Delivery> (*p)
+				&& boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
+			/* main delivery will increase port count to match input.
+			 * the Delivery::Main is usually the last processor - followed only by
+			 * 'MeterOutput'.
+			 */
+			seen_mains_out = true;
+		}
+		if (!seen_mains_out) {
+			processor_out_streams = out;
+		}
 	}
 
+
 	if (_meter) {
 		_meter->reset_max_channels (processor_max_streams);
 	}
@@ -1878,6 +1900,8 @@ Route::state(bool full_state)
 	node->add_property("denormal-protection", _denormal_protection?"yes":"no");
 	node->add_property("meter-point", enum_2_string (_meter_point));
 
+	node->add_property("meter-type", enum_2_string (_meter_type));
+
 	if (_route_group) {
 		node->add_property("route-group", _route_group->name());
 	}
@@ -1989,6 +2013,7 @@ 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));
@@ -2052,6 +2077,12 @@ Route::set_state (const XMLNode& node, int version)
 		}
 	}
 
+	if ((prop = node.property (X_("meter-type"))) != 0) {
+		_meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
+	}
+
+	_initial_io_setup = false;
+
 	set_processor_state (processor_state);
 
 	// this looks up the internal instrument in processors
@@ -2932,12 +2963,17 @@ void
 Route::output_change_handler (IOChange change, void * /*src*/)
 {
 	bool need_to_queue_solo_change = true;
+	if (_initial_io_setup) {
+		return;
+	}
 
 	if ((change.type & IOChange::ConfigurationChanged)) {
 		/* This is called with the process lock held if change 
 		   contains ConfigurationChanged 
 		*/
 		need_to_queue_solo_change = false;
+		configure_processors (0);
+		io_changed (); /* EMIT SIGNAL */
 	}
 
 	if (!_output->connected() && _soloed_by_others_downstream) {
@@ -3004,7 +3040,7 @@ Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
 		*/
 	}
 
-	BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
+	BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
 
 	fill_buffers_with_input (bufs, _input, nframes);
 
@@ -3043,7 +3079,7 @@ Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, in
 
 	_silent = false;
 
-	BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
+	BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
 
 	fill_buffers_with_input (bufs, _input, nframes);
 
@@ -3742,6 +3778,19 @@ Route::input_port_count_changing (ChanCount to)
 	return false;
 }
 
+/** Called when there is a proposed change to the output port count */
+bool
+Route::output_port_count_changing (ChanCount to)
+{
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		if (processor_out_streams.get(*t) > to.get(*t)) {
+			return true;
+		}
+	}
+	/* The change is ok */
+	return false;
+}
+
 list<string>
 Route::unknown_processors () const
 {
diff --git a/libs/ardour/run-profiling.sh b/libs/ardour/run-profiling.sh
index 30daac9..541c725 100644
--- a/libs/ardour/run-profiling.sh
+++ b/libs/ardour/run-profiling.sh
@@ -3,30 +3,12 @@
 # Run libardour profiling tests.
 #
 
-if [ ! -f './tempo.cc' ]; then
-    echo "This script must be run from within the libs/ardour directory";
-    exit 1;
-fi
-
 if [ "$1" == "" ]; then
    echo "Syntax: run-profiling.sh [flag] <test> [<args>]"
    exit 1;
 fi
 
-cd ../..
-top=`pwd`
-cd build
-
-libs='libs'
-
-export LD_LIBRARY_PATH=$libs/audiographer:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces/control_protocol:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/gtkmm2ext:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/timecode:/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH
-
-export ARDOUR_CONFIG_PATH=$top:$top/gtk2_ardour:$libs/..:$libs/../gtk2_ardour
-export ARDOUR_PANNER_PATH=$libs/panners/2in2out:$libs/panners/1in2out:$libs/panners/vbap
-export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie
-export ARDOUR_MCP_PATH="../mcp"
-export ARDOUR_DLL_PATH=$libs
-export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:.
+. test-env.sh
 
 export LD_PRELOAD=/home/carl/src/libfakejack/libjack.so
 # session='32tracks'
diff --git a/libs/ardour/run-tests.sh b/libs/ardour/run-tests.sh
index b317519..fc7d68a 100755
--- a/libs/ardour/run-tests.sh
+++ b/libs/ardour/run-tests.sh
@@ -3,30 +3,32 @@
 # Run libardour test suite.
 #
 
-if [ ! -f './tempo.cc' ]; then
-    echo "This script must be run from within the libs/ardour directory";
-    exit 1;
-fi
-
-cd ../..
-top=`pwd`
-cd build
-
-libs='libs'
-
-export LD_LIBRARY_PATH=$libs/audiographer:$libs/vamp-sdk:$libs/surfaces:$libs/surfaces/control_protocol:$libs/ardour:$libs/midi++2:$libs/pbd:$libs/rubberband:$libs/soundtouch:$libs/gtkmm2ext:$libs/appleutility:$libs/taglib:$libs/evoral:$libs/evoral/src/libsmf:$libs/timecode:$libs/libltc:/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH
-
-export ARDOUR_CONFIG_PATH=$top:$top/gtk2_ardour:$libs/..:$libs/../gtk2_ardour
-export ARDOUR_PANNER_PATH=$libs/panners/2in2out:$libs/panners/1in2out:$libs/panners/vbap
-export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie
-export ARDOUR_MCP_PATH="../mcp"
-export ARDOUR_DLL_PATH=$libs
-export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:.
-
-if [ "$1" == "--debug" ]; then
-        gdb ./libs/ardour/run-tests
-elif [ "$1" == "--valgrind" ]; then
-        valgrind ./libs/ardour/run-tests
+if [ "$1" == "--single" ] || [ "$2" == "--single" ]; then
+        if [ "$1" == "--single" ]; then
+	        TESTS="test_*$2*"
+        elif [ "$2" == "--single" ]; then
+	        TESTS="test_*$3*"
+	else
+                TESTS='test_*'
+        fi
+	for test_program in `find libs/ardour -name "$TESTS" -type f -perm /u+x`;
+	do
+		echo "Running $test_program..."
+                if [ "$1" == "--debug" ]; then
+	                gdb ./"$test_program"
+                elif [ "$1" == "--valgrind" ]; then
+	                valgrind ./"$test_program"
+	        else
+	                ./"$test_program"
+	        fi
+	done
 else
-        ./libs/ardour/run-tests $*
+        if [ "$1" == "--debug" ]; then
+                gdb ./libs/ardour/run-tests
+        elif [ "$1" == "--valgrind" ]; then
+                valgrind ./libs/ardour/run-tests
+        else
+                ./libs/ardour/run-tests $*
+        fi
 fi
+
diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc
index 107cf98..e74fd7f 100644
--- a/libs/ardour/send.cc
+++ b/libs/ardour/send.cc
@@ -270,7 +270,7 @@ Send::set_state_2X (const XMLNode& node, int /* version */)
 }
 
 bool
-Send::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+Send::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
 	/* sends have no impact at all on the channel configuration of the
 	   streams passing through the route. so, out == in.
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 914c6a9..ce82f79 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -4170,12 +4170,19 @@ Session::get_silent_buffers (ChanCount count)
 }
 
 BufferSet&
-Session::get_scratch_buffers (ChanCount count)
+Session::get_scratch_buffers (ChanCount count, bool silence)
 {
-	return ProcessThread::get_scratch_buffers (count);
+	return ProcessThread::get_scratch_buffers (count, silence);
 }
 
 BufferSet&
+Session::get_route_buffers (ChanCount count, bool silence)
+{
+	return ProcessThread::get_route_buffers (count, silence);
+}
+
+
+BufferSet&
 Session::get_mix_buffers (ChanCount count)
 {
 	return ProcessThread::get_mix_buffers (count);
diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc
index f293970..d6cc201 100644
--- a/libs/ardour/session_ltc.cc
+++ b/libs/ardour/session_ltc.cc
@@ -82,6 +82,7 @@ Session::ltc_tx_initialize()
 	 * since the fps can change and A3's  min fps: 24000/1001 */
 	ltc_enc_buf = (ltcsnd_sample_t*) calloc((nominal_frame_rate() / 23), sizeof(ltcsnd_sample_t));
 	ltc_speed = 0;
+	ltc_prev_cycle = -1;
 	ltc_tx_reset();
 	ltc_tx_resync_latency();
 	Xrun.connect_same_thread (*this, boost::bind (&Session::ltc_tx_reset, this));
@@ -132,6 +133,7 @@ Session::ltc_tx_parse_offset() {
 	offset_tc.drop = timecode_drop_frames();
 	timecode_to_sample(offset_tc, ltc_timecode_offset, false, false);
 	ltc_timecode_negative_offset = !offset_tc.negative;
+	ltc_prev_cycle = -1;
 }
 
 void
@@ -214,7 +216,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
 	if (cur_timecode != ltc_enc_tcformat) {
 		DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX1: TC format mismatch - reinit sr: %1 fps: %2\n", nominal_frame_rate(), timecode_to_frames_per_second(cur_timecode)));
 		if (ltc_encoder_reinit(ltc_encoder, nominal_frame_rate(),
-					timecode_to_frames_per_second(cur_timecode), 
+					timecode_to_frames_per_second(cur_timecode),
 					TV_STANDARD(cur_timecode), 0
 					)) {
 			PBD::error << _("LTC encoder: invalid framerate - LTC encoding is disabled for the remainder of this session.") << endmsg;
@@ -244,10 +246,25 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
 	 * The _generated timecode_ is offset by the port-latency,
 	 * therefore the offset depends on the direction of transport.
 	 */
-	framepos_t cycle_start_frame = (current_speed < 0) ? (start_frame - ltc_out_latency.max) : (start_frame + ltc_out_latency.max);
+	framepos_t cycle_start_frame;
+
+	if (current_speed < 0) {
+		cycle_start_frame = (start_frame - ltc_out_latency.max);
+	} else if (current_speed > 0) {
+		cycle_start_frame = (start_frame + ltc_out_latency.max);
+	} else {
+		/* There is no need to compensate for latency when not rolling
+		 * rather send the accurate NOW timecode
+		 * (LTC encoder compenates latency by sending earlier timecode)
+		 */
+		cycle_start_frame = start_frame;
+	}
 
 	/* LTC TV standard offset */
-	cycle_start_frame -= ltc_frame_alignment(frames_per_timecode_frame(), TV_STANDARD(cur_timecode));
+	if (current_speed != 0) {
+		/* ditto - send "NOW" if not rolling */
+		cycle_start_frame -= ltc_frame_alignment(frames_per_timecode_frame(), TV_STANDARD(cur_timecode));
+	}
 
 	/* cycle-start may become negative due to latency compensation */
 	if (cycle_start_frame < 0) { cycle_start_frame = 0; }
@@ -262,7 +279,13 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
 		ltc_tx_reset();
 	}
 
-	if (ltc_speed != new_ltc_speed) {
+	if (ltc_speed != new_ltc_speed
+			/* but only once if, current_speed changes to 0. In that case
+			 * new_ltc_speed is > 0 because (end_frame - start_frame) == jack-period for no-roll
+			 * but ltc_speed will still be 0
+			 */
+			&& (current_speed != 0 || ltc_speed != current_speed)
+			) {
 		/* check ./libs/ardour/interpolation.cc  CubicInterpolation::interpolate
 		 * if target_speed != current_speed we should interpolate, too.
 		 *
@@ -272,7 +295,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
 		 * end_frame is calculated from 'frames_moved' which includes the interpolation.
 		 * so we're good.
 		 */
-		DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX2: speed change old: %1 cur: %2 tgt: %3 ctd: %4\n", ltc_speed, current_speed, target_speed, fabs(current_speed) - target_speed));
+		DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX2: speed change old: %1 cur: %2 tgt: %3 ctd: %4\n", ltc_speed, current_speed, target_speed, fabs(current_speed) - target_speed, new_ltc_speed));
 		speed_changed = true;
 		ltc_encoder_set_filter(ltc_encoder, LTC_RISE_TIME(new_ltc_speed));
 	}
@@ -292,6 +315,10 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
 			ltc_speed = new_ltc_speed;
 			return;
 		}
+		if (start_frame != ltc_prev_cycle) {
+			DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX2: no-roll seek from %1 to %2 (%3)\n", ltc_prev_cycle, start_frame, cycle_start_frame));
+			ltc_tx_reset();
+		}
 	}
 
 	if (fabs(new_ltc_speed) > 10.0) {
@@ -375,6 +402,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
 		}
 	}
 
+	ltc_prev_cycle = start_frame;
 	ltc_speed = new_ltc_speed;
 	DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX2: transport speed %1.\n", ltc_speed));
 
@@ -400,6 +428,9 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
 
 	/* difference between current frame and TC frame in samples */
 	frameoffset_t soff = cycle_start_frame - tc_sample_start;
+	if (current_speed == 0) {
+		soff = 0;
+	}
 	DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX3: A3cycle: %1 = A3tc: %2 +off: %3\n",
 				cycle_start_frame, tc_sample_start, soff));
 
@@ -465,7 +496,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
 
 		DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX4: now: %1 trs: %2 toff %3\n", cycle_start_frame, tc_sample_start, soff));
 
-		uint32_t cyc_off;
+		int32_t cyc_off;
 		if (soff < 0 || soff >= fptcf) {
 			/* session framerate change between (2) and now */
 			ltc_tx_reset();
@@ -501,7 +532,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
 			restarting = true;
 		}
 
-		if (cyc_off > 0 && cyc_off <= nframes) {
+		if (cyc_off >= 0 && cyc_off <= (int32_t) nframes) {
 			/* offset in this cycle */
 			txf= rint(cyc_off / fabs(ltc_speed));
 			memset(out, 0, cyc_off * sizeof(Sample));
diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc
index 50a7178..d137e51 100644
--- a/libs/ardour/session_midi.cc
+++ b/libs/ardour/session_midi.cc
@@ -45,6 +45,7 @@
 #include "ardour/midi_ui.h"
 #include "ardour/session.h"
 #include "ardour/slave.h"
+#include "ardour/ticker.h"
 
 #include "i18n.h"
 
@@ -581,6 +582,19 @@ Session::mmc_step_timeout ()
 	return true;
 }
 
+/***********************************************************************
+ OUTBOUND SYSTEM COMMON STUFF
+**********************************************************************/
+
+
+void
+Session::send_song_position_pointer (framepos_t t)
+{
+	if (midi_clock) {
+		/* Do nothing for the moment */
+	}
+}
+
 int
 Session::start_midi_thread ()
 {
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc
index 067a91d..cecbd88 100644
--- a/libs/ardour/session_process.cc
+++ b/libs/ardour/session_process.cc
@@ -45,8 +45,6 @@
 
 #include "i18n.h"
 
-#include <xmmintrin.h>
-
 using namespace ARDOUR;
 using namespace PBD;
 using namespace std;
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index b98a044..51d8d2c 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -384,6 +384,7 @@ Session::butler_transport_work ()
 	g_atomic_int_dec_and_test (&_butler->should_do_transport_work);
 
 	DEBUG_TRACE (DEBUG::Transport, X_("Butler transport work all done\n"));
+	DEBUG_TRACE (DEBUG::Transport, X_(string_compose ("Frame %1\n", _transport_frame)));
 }
 
 void
@@ -1007,6 +1008,7 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool
 		send_mmc_locate (_transport_frame);
 	}
 
+	_last_roll_location = _last_roll_or_reversal_location =  _transport_frame;
 	Located (); /* EMIT SIGNAL */
 }
 
diff --git a/libs/ardour/run-tests.sh b/libs/ardour/test-env.sh
old mode 100755
new mode 100644
similarity index 79%
copy from libs/ardour/run-tests.sh
copy to libs/ardour/test-env.sh
index b317519..aa2cff9
--- a/libs/ardour/run-tests.sh
+++ b/libs/ardour/test-env.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-# Run libardour test suite.
+# Common libardour test env vars.
 #
 
 if [ ! -f './tempo.cc' ]; then
@@ -8,9 +8,9 @@ if [ ! -f './tempo.cc' ]; then
     exit 1;
 fi
 
-cd ../..
-top=`pwd`
-cd build
+srcdir=`pwd`
+export ARDOUR_TEST_PATH=$srcdir/test/data
+cd ../../build
 
 libs='libs'
 
@@ -22,11 +22,3 @@ export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs
 export ARDOUR_MCP_PATH="../mcp"
 export ARDOUR_DLL_PATH=$libs
 export ARDOUR_DATA_PATH=$top/gtk2_ardour:$top/build/gtk2_ardour:.
-
-if [ "$1" == "--debug" ]; then
-        gdb ./libs/ardour/run-tests
-elif [ "$1" == "--valgrind" ]; then
-        valgrind ./libs/ardour/run-tests
-else
-        ./libs/ardour/run-tests $*
-fi
diff --git a/libs/ardour/test/audio_region_test.cc b/libs/ardour/test/audio_region_test.cc
index c7008d9..df3fa72 100644
--- a/libs/ardour/test/audio_region_test.cc
+++ b/libs/ardour/test/audio_region_test.cc
@@ -16,6 +16,8 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#include <glibmm/miscutils.h>
+
 #include "pbd/compose.h"
 #include "ardour/playlist_factory.h"
 #include "ardour/source_factory.h"
@@ -26,6 +28,7 @@
 #include "ardour/audioplaylist.h"
 #include "audio_region_test.h"
 #include "test_globals.h"
+#include "test_common.h"
 
 using namespace std;
 using namespace PBD;
@@ -36,9 +39,7 @@ AudioRegionTest::setUp ()
 {
 	TestNeedingSession::setUp ();
 
-	/* This is important, otherwise createWritable will mark the source immutable (hence unwritable) */
-	unlink ("libs/ardour/test/test.wav");
-	string const test_wav_path = "libs/ardour/test/test.wav";
+	std::string const test_wav_path = Glib::build_filename (new_test_output_dir(), "test.wav");
 	_playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test");
 	_audio_playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_playlist);
 	_source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, "", false, Fs);
diff --git a/libs/ardour/test/data/2 Track-template/2 Track-template.template b/libs/ardour/test/data/2 Track-template/2 Track-template.template
new file mode 100644
index 0000000..e43458e
--- /dev/null
+++ b/libs/ardour/test/data/2 Track-template/2 Track-template.template	
@@ -0,0 +1,238 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Session version="3001" id-counter="448" event-counter="0">
+  <Config>
+    <Option name="xfade-model" value="FullCrossfade"/>
+    <Option name="xfade-choice" value="ConstantPowerMinus3dB"/>
+    <Option name="auto-xfade" value="1"/>
+    <Option name="short-xfade-seconds" value="0.015"/>
+    <Option name="destructive-xfade-msecs" value="2"/>
+    <Option name="use-region-fades" value="1"/>
+    <Option name="show-region-fades" value="1"/>
+    <Option name="native-file-data-format" value="FormatFloat"/>
+    <Option name="native-file-header-format" value="WAVE"/>
+    <Option name="auto-play" value="0"/>
+    <Option name="auto-return" value="0"/>
+    <Option name="auto-input" value="1"/>
+    <Option name="punch-in" value="0"/>
+    <Option name="punch-out" value="0"/>
+    <Option name="subframes-per-frame" value="100"/>
+    <Option name="timecode-format" value="timecode_30"/>
+    <Option name="raid-path" value=""/>
+    <Option name="audio-search-path" value=""/>
+    <Option name="midi-search-path" value=""/>
+    <Option name="auditioner-output-left" value="default"/>
+    <Option name="auditioner-output-right" value="default"/>
+    <Option name="timecode-source-is-synced" value="1"/>
+    <Option name="jack-time-master" value="1"/>
+    <Option name="use-video-sync" value="0"/>
+    <Option name="video-pullup" value="0"/>
+    <Option name="show-summary" value="1"/>
+    <Option name="show-group-tabs" value="1"/>
+    <Option name="external-sync" value="0"/>
+    <Option name="sync-source" value="JACK"/>
+    <Option name="insert-merge-policy" value="InsertMergeRelax"/>
+    <Option name="timecode-offset" value="0"/>
+    <Option name="timecode-offset-negative" value="1"/>
+    <Option name="glue-new-markers-to-bars-and-beats" value="0"/>
+    <Option name="midi-copy-is-fork" value="0"/>
+    <Option name="glue-new-regions-to-bars-and-beats" value="0"/>
+  </Config>
+  <Metadata/>
+  <Sources/>
+  <Regions/>
+  <Locations>
+    <Location id="449" name="session" start="0" end="0" flags="IsSessionRange" locked="no" position-lock-style="AudioTime"/>
+  </Locations>
+  <Bundles/>
+  <Routes>
+    <Route id="21" name="master" default-type="audio" flags="MasterOut" active="yes" phase-invert="00" denormal-protection="no" meter-point="MeterPostFader" order-keys="editor=0:signal=0" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no">
+      <IO name="master" id="38" direction="Input" default-type="audio" user-latency="0">
+        <Port type="audio" name="master/audio_in 1">
+          <Connection other="Audio 1/audio_out 1"/>
+          <Connection other="Audio 2/audio_out 1"/>
+        </Port>
+        <Port type="audio" name="master/audio_in 2">
+          <Connection other="Audio 1/audio_out 2"/>
+          <Connection other="Audio 2/audio_out 2"/>
+        </Port>
+      </IO>
+      <IO name="master" id="39" direction="Output" default-type="audio" user-latency="0">
+        <Port type="audio" name="master/audio_out 1">
+          <Connection other="system:playback_1"/>
+        </Port>
+        <Port type="audio" name="master/audio_out 2">
+          <Connection other="system:playback_2"/>
+        </Port>
+      </IO>
+      <Controllable name="solo" id="23" flags="Toggle" value="0.000000000000"/>
+      <Controllable name="mute" id="317" flags="Toggle" value="0.000000000000"/>
+      <MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
+      <RemoteControl id="318"/>
+      <Pannable>
+        <Controllable name="pan-azimuth" id="29" flags="" value="0.500000000000"/>
+        <Controllable name="pan-width" id="33" flags="" value="1.000000000000"/>
+        <Controllable name="pan-elevation" id="31" flags="" value="0.000000000000"/>
+        <Controllable name="pan-frontback" id="35" flags="" value="0.000000000000"/>
+        <Controllable name="pan-lfe" id="37" flags="" value="0.000000000000"/>
+        <Automation/>
+      </Pannable>
+      <Processor id="40" name="Amp" active="yes" user-latency="0" type="amp">
+        <Controllable name="gaincontrol" id="42" flags="GainLike" value="1.000000000000"/>
+      </Processor>
+      <Processor id="43" name="Meter" active="yes" user-latency="0" type="meter"/>
+      <Processor id="44" name="master" active="yes" user-latency="0" own-input="yes" own-output="no" output="master" type="main-outs" role="Main">
+        <PannerShell bypassed="no">
+          <Panner type="Equal Power Stereo"/>
+        </PannerShell>
+      </Processor>
+    </Route>
+    <Route id="86" name="Audio 1" default-type="audio" active="yes" phase-invert="00" denormal-protection="no" meter-point="MeterPostFader" order-keys="editor=1:signal=1" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no" monitoring="" saved-meter-point="MeterPostFader" mode="Normal">
+      <IO name="Audio 1" id="103" direction="Input" default-type="audio" user-latency="0">
+        <Port type="audio" name="Audio 1/audio_in 1"/>
+        <Port type="audio" name="Audio 1/audio_in 2"/>
+      </IO>
+      <IO name="Audio 1" id="104" direction="Output" default-type="audio" user-latency="0">
+        <Port type="audio" name="Audio 1/audio_out 1">
+          <Connection other="master/audio_in 1"/>
+        </Port>
+        <Port type="audio" name="Audio 1/audio_out 2">
+          <Connection other="master/audio_in 2"/>
+        </Port>
+      </IO>
+      <Controllable name="solo" id="88" flags="Toggle" value="0.000000000000"/>
+      <Controllable name="mute" id="343" flags="Toggle" value="0.000000000000"/>
+      <MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
+      <RemoteControl id="2"/>
+      <Pannable>
+        <Controllable name="pan-azimuth" id="94" flags="" value="0.500000000000"/>
+        <Controllable name="pan-width" id="98" flags="" value="1.000000000000"/>
+        <Controllable name="pan-elevation" id="96" flags="" value="0.000000000000"/>
+        <Controllable name="pan-frontback" id="100" flags="" value="0.000000000000"/>
+        <Controllable name="pan-lfe" id="102" flags="" value="0.000000000000"/>
+        <Automation/>
+      </Pannable>
+      <Processor id="105" name="Amp" active="yes" user-latency="0" type="amp">
+        <Controllable name="gaincontrol" id="107" flags="GainLike" value="1.000000000000"/>
+      </Processor>
+      <Processor id="108" name="Meter" active="yes" user-latency="0" type="meter"/>
+      <Processor id="109" name="Audio 1" active="yes" user-latency="0" own-input="yes" own-output="no" output="Audio 1" type="main-outs" role="Main">
+        <PannerShell bypassed="no">
+          <Panner type="Equal Power Stereo"/>
+        </PannerShell>
+      </Processor>
+      <Controllable name="recenable" id="111" flags="Toggle" value="0.000000000000"/>
+      <Diskstream flags="Recordable" playlist="Audio 1.1" name="Audio 1" id="113" speed="1.000000" capture-alignment="Automatic" channels="2"/>
+    </Route>
+    <Route id="121" name="Audio 2" default-type="audio" active="yes" phase-invert="00" denormal-protection="no" meter-point="MeterPostFader" order-keys="editor=2:signal=2" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no" monitoring="" saved-meter-point="MeterPostFader" mode="Normal">
+      <IO name="Audio 2" id="138" direction="Input" default-type="audio" user-latency="0">
+        <Port type="audio" name="Audio 2/audio_in 1"/>
+        <Port type="audio" name="Audio 2/audio_in 2"/>
+      </IO>
+      <IO name="Audio 2" id="139" direction="Output" default-type="audio" user-latency="0">
+        <Port type="audio" name="Audio 2/audio_out 1">
+          <Connection other="master/audio_in 1"/>
+        </Port>
+        <Port type="audio" name="Audio 2/audio_out 2">
+          <Connection other="master/audio_in 2"/>
+        </Port>
+      </IO>
+      <Controllable name="solo" id="123" flags="Toggle" value="0.000000000000"/>
+      <Controllable name="mute" id="376" flags="Toggle" value="0.000000000000"/>
+      <MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
+      <RemoteControl id="3"/>
+      <Pannable>
+        <Controllable name="pan-azimuth" id="129" flags="" value="0.500000000000"/>
+        <Controllable name="pan-width" id="133" flags="" value="1.000000000000"/>
+        <Controllable name="pan-elevation" id="131" flags="" value="0.000000000000"/>
+        <Controllable name="pan-frontback" id="135" flags="" value="0.000000000000"/>
+        <Controllable name="pan-lfe" id="137" flags="" value="0.000000000000"/>
+        <Automation/>
+      </Pannable>
+      <Processor id="140" name="Amp" active="yes" user-latency="0" type="amp">
+        <Controllable name="gaincontrol" id="142" flags="GainLike" value="1.000000000000"/>
+      </Processor>
+      <Processor id="143" name="Meter" active="yes" user-latency="0" type="meter"/>
+      <Processor id="144" name="Audio 2" active="yes" user-latency="0" own-input="yes" own-output="no" output="Audio 2" type="main-outs" role="Main">
+        <PannerShell bypassed="no">
+          <Panner type="Equal Power Stereo"/>
+        </PannerShell>
+      </Processor>
+      <Controllable name="recenable" id="146" flags="Toggle" value="0.000000000000"/>
+      <Diskstream flags="Recordable" playlist="Audio 2.1" name="Audio 2" id="148" speed="1.000000" capture-alignment="Automatic" channels="2"/>
+    </Route>
+  </Routes>
+  <Playlists>
+    <Playlist id="114" name="Audio 1.1" type="audio" orig-track-id="86" frozen="no"/>
+    <Playlist id="149" name="Audio 2.1" type="audio" orig-track-id="121" frozen="no"/>
+  </Playlists>
+  <UnusedPlaylists/>
+  <RouteGroups/>
+  <Click>
+    <IO name="click" id="46" direction="Output" default-type="audio" user-latency="0">
+      <Port type="audio" name="click/audio_out 1">
+        <Connection other="system:playback_1"/>
+      </Port>
+      <Port type="audio" name="click/audio_out 2">
+        <Connection other="system:playback_2"/>
+      </Port>
+    </IO>
+    <Processor id="47" name="Amp" active="yes" user-latency="0" type="amp">
+      <Controllable name="gaincontrol" id="49" flags="GainLike" value="1.000000000000"/>
+    </Processor>
+  </Click>
+  <Speakers>
+    <Speaker azimuth="0" elevation="0" distance="1"/>
+    <Speaker azimuth="180" elevation="0" distance="0"/>
+  </Speakers>
+  <TempoMap>
+    <Tempo start="1|1|0" beats-per-minute="120.000000" note-type="4.000000" movable="no"/>
+    <Meter start="1|1|0" note-type="4.000000" divisions-per-bar="4.000000" movable="no"/>
+  </TempoMap>
+  <ControlProtocols>
+    <Protocol name="Open Sound Control (OSC)" active="no"/>
+    <Protocol name="Generic MIDI" active="no"/>
+    <Protocol name="Mackie" active="no"/>
+  </ControlProtocols>
+  <Extra>
+    <UI>
+      <Window name="M-21-40" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="M-21-43" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="M-21-44" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="M-86-105" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="M-86-108" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="M-86-109" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="M-121-140" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="M-121-143" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="M-121-144" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="R-121-140" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="R-121-143" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <Window name="R-121-144" visible="no" x-off="-1" y-off="-1" x-size="-1" y-size="-1"/>
+      <GUIObjectState>
+        <Object id="route 21" color="23134:6077:43676"/>
+        <Object id="rtav 21" height="68" visible="1"/>
+        <Object id="automation 42" height="68" visible="0"/>
+        <Object id="automation 29" height="68" visible="0"/>
+        <Object id="automation 33" height="68" visible="0"/>
+        <Object id="strip 21" visible="1" strip-width="Wide">
+          <Object id="processor 40"/>
+        </Object>
+        <Object id="route 86" color="10279:41554:7510"/>
+        <Object id="strip 86" visible="1" strip-width="Wide">
+          <Object id="processor 105"/>
+        </Object>
+        <Object id="route 121" color="26161:25387:7015"/>
+        <Object id="strip 121" visible="1" strip-width="Wide">
+          <Object id="processor 140"/>
+        </Object>
+        <Object id="rtav 86" height="68" visible="1"/>
+        <Object id="automation 107" height="68" visible="0"/>
+        <Object id="automation 94" height="68" visible="0"/>
+        <Object id="automation 98" height="68" visible="0"/>
+        <Object id="rtav 121" height="68" visible="1"/>
+        <Object id="automation 142" height="68" visible="0"/>
+        <Object id="automation 129" height="68" visible="0"/>
+        <Object id="automation 133" height="68" visible="0"/>
+      </GUIObjectState>
+    </UI>
+  </Extra>
+</Session>
diff --git a/libs/ardour/test/data/mantis_3356/interchange/mantis_3356/midifiles/Midi 1-1.mid b/libs/ardour/test/data/mantis_3356/interchange/mantis_3356/midifiles/Midi 1-1.mid
old mode 100755
new mode 100644
diff --git a/libs/ardour/test/data/test.wav b/libs/ardour/test/data/test.wav
old mode 100755
new mode 100644
diff --git a/libs/ardour/test/resampled_source_test.cc b/libs/ardour/test/resampled_source_test.cc
index 983c0d8..5aaf71b 100644
--- a/libs/ardour/test/resampled_source_test.cc
+++ b/libs/ardour/test/resampled_source_test.cc
@@ -1,15 +1,27 @@
+// this is included first to avoid SearchPath definition on windows
+#include "test_common.h"
+
+#include "pbd/file_utils.h"
 #include "ardour/resampled_source.h"
 #include "ardour/sndfileimportable.h"
 #include "resampled_source_test.h"
 
+
 CPPUNIT_TEST_SUITE_REGISTRATION (ResampledSourceTest);
 
+using namespace std;
 using namespace ARDOUR;
+using namespace PBD;
 
 void
 ResampledSourceTest::seekTest ()
 {
-	boost::shared_ptr<SndFileImportableSource> s (new SndFileImportableSource ("../libs/ardour/test/data/test.wav"));
+	std::string test_file_path;
+	const string test_filename = "test.wav";
+
+	CPPUNIT_ASSERT (find_file_in_search_path (test_search_path (), test_filename, test_file_path));
+
+	boost::shared_ptr<SndFileImportableSource> s (new SndFileImportableSource (test_file_path));
 	ResampledImportableSource r (s, 48000, SrcBest);
 
 	/* Make sure that seek (0) has the desired effect, ie that
diff --git a/libs/ardour/test/session_test.cc b/libs/ardour/test/session_test.cc
new file mode 100644
index 0000000..83273b5
--- /dev/null
+++ b/libs/ardour/test/session_test.cc
@@ -0,0 +1,121 @@
+
+#include <glibmm/fileutils.h>
+#include <glibmm/miscutils.h>
+
+#include <stdexcept>
+#include "midi++/manager.h"
+#include "pbd/textreceiver.h"
+#include "pbd/file_utils.h"
+#include "ardour/session.h"
+#include "ardour/audioengine.h"
+#include "ardour/smf_source.h"
+#include "ardour/midi_model.h"
+
+#include "test_common.h"
+
+#include "session_test.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION (SessionTest);
+
+using namespace std;
+using namespace ARDOUR;
+using namespace PBD;
+
+static TextReceiver text_receiver ("test");
+
+void
+SessionTest::setUp ()
+{
+	SessionEvent::create_per_thread_pool ("session_test", 512);
+
+	text_receiver.listen_to (error);
+	text_receiver.listen_to (info);
+	text_receiver.listen_to (fatal);
+	text_receiver.listen_to (warning);
+
+	// this is not a good singleton constructor pattern
+	AudioEngine* engine = 0;
+
+	try {
+		engine = new AudioEngine ("session_test", "");
+	} catch (const AudioEngine::NoBackendAvailable& engine_exception) {
+		cerr << engine_exception.what ();
+	}
+
+	CPPUNIT_ASSERT (engine);
+
+	init_post_engine ();
+
+	CPPUNIT_ASSERT (engine->start () == 0);
+}
+
+void
+SessionTest::tearDown ()
+{
+	// this is needed or there is a crash in MIDI::Manager::destroy
+	AudioEngine::instance()->stop (true);
+
+	MIDI::Manager::destroy ();
+	AudioEngine::destroy ();
+}
+
+void
+SessionTest::new_session ()
+{
+	const string session_name("test_session");
+	std::string new_session_dir = Glib::build_filename (new_test_output_dir(), session_name);
+
+	CPPUNIT_ASSERT (!Glib::file_test (new_session_dir, Glib::FILE_TEST_EXISTS));
+
+	Session* new_session = 0;
+
+	new_session = new Session (*AudioEngine::instance (), new_session_dir, session_name);
+
+	CPPUNIT_ASSERT (new_session);
+
+	// shouldn't need to do this as it is done in Session constructor
+	// via Session::when_engine_running
+	//AudioEngine::instance->set_session (new_session);
+
+	new_session->save_state ("");
+
+	delete new_session;
+}
+
+void
+SessionTest::new_session_from_template ()
+{
+	const string session_name("two_tracks");
+	const string session_template_dir_name("2 Track-template");
+
+	std::string new_session_dir = Glib::build_filename (new_test_output_dir(), session_name);
+
+	CPPUNIT_ASSERT (!Glib::file_test (new_session_dir, Glib::FILE_TEST_EXISTS));
+
+	std::string session_template_dir = test_search_path ().front ();
+	session_template_dir = Glib::build_filename (session_template_dir, "2 Track-template");
+
+	CPPUNIT_ASSERT (Glib::file_test (session_template_dir, Glib::FILE_TEST_IS_DIR));
+
+	Session* new_session = 0;
+	BusProfile* bus_profile = 0;
+
+	// create a new session based on session template
+	new_session = new Session (*AudioEngine::instance (), new_session_dir, session_name,
+				bus_profile, session_template_dir);
+
+	CPPUNIT_ASSERT (new_session);
+
+	new_session->save_state ("");
+
+	delete new_session;
+
+	Session* template_session = 0;
+
+	// reopen same session to check that it opens without error
+	template_session = new Session (*AudioEngine::instance (), new_session_dir, session_name);
+
+	CPPUNIT_ASSERT (template_session);
+
+	delete template_session;
+}
diff --git a/libs/ardour/test/session_test.h b/libs/ardour/test/session_test.h
new file mode 100644
index 0000000..cadab67
--- /dev/null
+++ b/libs/ardour/test/session_test.h
@@ -0,0 +1,18 @@
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+class SessionTest : public CppUnit::TestFixture
+{
+	CPPUNIT_TEST_SUITE (SessionTest);
+	CPPUNIT_TEST (new_session);
+	CPPUNIT_TEST (new_session_from_template);
+	CPPUNIT_TEST_SUITE_END ();
+
+public:
+	virtual void setUp ();
+	virtual void tearDown ();
+
+	void new_session ();
+	void new_session_from_template ();
+};
diff --git a/libs/ardour/test/test_common.cc b/libs/ardour/test/test_common.cc
new file mode 100644
index 0000000..8364d91
--- /dev/null
+++ b/libs/ardour/test/test_common.cc
@@ -0,0 +1,53 @@
+/*
+    Copyright (C) 2011 Tim Mayberry
+
+    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 <glibmm/fileutils.h>
+#include <glibmm/miscutils.h>
+
+#include "test_common.h"
+
+using namespace std;
+
+PBD::SearchPath
+test_search_path ()
+{
+#ifdef WIN32
+	std::string wsp(g_win32_get_package_installation_directory_of_module(NULL));
+	return Glib::build_filename (wsp, "ardour_testdata");
+#else
+	return Glib::getenv("ARDOUR_TEST_PATH");
+#endif
+}
+
+std::string
+new_test_output_dir ()
+{
+	std::string tmp_dir = Glib::build_filename (g_get_tmp_dir(), "ardour_test");
+	std::string dir_name;
+	std::string new_test_dir;
+	do {
+		ostringstream oss;
+		oss << g_random_int ();
+		dir_name = oss.str();
+		new_test_dir = Glib::build_filename (tmp_dir, dir_name);
+		if (Glib::file_test (new_test_dir, Glib::FILE_TEST_EXISTS)) continue;
+	} while (g_mkdir_with_parents (new_test_dir.c_str(), 0755) != 0);
+	return new_test_dir;
+}
diff --git a/libs/ardour/data_type.cc b/libs/ardour/test/test_common.h
similarity index 71%
copy from libs/ardour/data_type.cc
copy to libs/ardour/test/test_common.h
index 4a43009..9e15458 100644
--- a/libs/ardour/data_type.cc
+++ b/libs/ardour/test/test_common.h
@@ -1,6 +1,5 @@
 /*
-    Copyright (C) 2006 Paul Davis
-    Author: David Robillard
+    Copyright (C) 2011 Tim Mayberry
 
     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
@@ -17,15 +16,13 @@
     675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#include "ardour/data_type.h"
-#include "i18n.h"
-
-const char *
-ARDOUR::DataType::to_i18n_string () const
-{
-	switch (_symbol) {
-	case AUDIO: return _("audio");
-	case MIDI: return _("MIDI");
-	default: return _("unknown");
-	}
-}
+#ifndef ARDOUR_TEST_COMMON_H
+#define ARDOUR_TEST_COMMON_H
+
+#include "pbd/search_path.h"
+
+PBD::SearchPath test_search_path ();
+
+std::string new_test_output_dir ();
+
+#endif
diff --git a/libs/ardour/test/test_needing_session.cc b/libs/ardour/test/test_needing_session.cc
index a6220de..181d391 100644
--- a/libs/ardour/test/test_needing_session.cc
+++ b/libs/ardour/test/test_needing_session.cc
@@ -1,3 +1,5 @@
+#include <glibmm/miscutils.h>
+
 #include "midi++/manager.h"
 #include "pbd/compose.h"
 #include "pbd/enumwriter.h"
@@ -5,6 +7,7 @@
 #include "ardour/audioengine.h"
 #include "test_needing_session.h"
 #include "test_util.h"
+#include "test_common.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -13,9 +16,9 @@ using namespace PBD;
 void
 TestNeedingSession::setUp ()
 {
-	string const test_session_path = "libs/ardour/test/test_session";
-	system (string_compose ("rm -rf %1", test_session_path).c_str());
-	_session = load_session (test_session_path, "test_session");
+	const string session_name("test_session");
+	std::string new_session_dir = Glib::build_filename (new_test_output_dir(), session_name);
+	_session = load_session (new_session_dir, "test_session");
 }
 
 void
diff --git a/libs/ardour/thread_buffers.cc b/libs/ardour/thread_buffers.cc
index 34f6f98..fd3160b 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)
+	, route_buffers (new BufferSet)
 	, mix_buffers (new BufferSet)
 	, gain_automation_buffer (0)
 	, send_gain_automation_buffer (0)
@@ -64,6 +65,7 @@ ThreadBuffers::ensure_buffers (ChanCount howmany)
 		scratch_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);
 	}
 
 	delete [] gain_automation_buffer;
diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc
index 5d07895..f32cdf9 100644
--- a/libs/ardour/ticker.cc
+++ b/libs/ardour/ticker.cc
@@ -32,15 +32,84 @@
 #include "ardour/debug.h"
 
 using namespace ARDOUR;
+using namespace PBD;
+
+/** MIDI Clock Position tracking */
+class MidiClockTicker::Position : public Timecode::BBT_Time
+{
+public:
+
+	Position() : speed(0.0f), frame(0) { }
+	~Position() { }
+
+	/** Sync timing information taken from the given Session
+		@return True if timings differed */
+	bool sync (Session* s) {
+
+		bool didit = false;
+
+		double     sp = s->transport_speed();
+		framecnt_t fr = s->transport_frame();
+
+		if (speed != sp) {
+			speed = sp;
+			didit = true;
+		}
+
+		if (frame != fr) {
+			frame = fr;
+			didit = true;
+		}
+
+		/* Midi beats and clocks always gets updated for now */
+
+		s->bbt_time (this->frame, *this);
+
+		const TempoMap& tempo = s->tempo_map();
+
+		const double divisions   = tempo.meter_at(frame).divisions_per_bar();
+		const double divisor     = tempo.meter_at(frame).note_divisor();
+		const double qnote_scale = divisor * 0.25f;
+
+		/** Midi Beats in terms of Song Position Pointer is equivalent to total
+			sixteenth notes at 'time' */
+
+		midi_beats  = (((bars - 1) * divisions) + beats - 1);
+		midi_beats += (double)ticks / (double)Position::ticks_per_beat * qnote_scale;
+		midi_beats *= 16.0f / divisor;
+
+		midi_clocks = midi_beats * 6.0f;
+
+		return didit;
+	}
+
+	double      speed;
+	framecnt_t  frame;
+	double      midi_beats;
+	double      midi_clocks;
+
+	void print (std::ostream& s) {
+		s << "frames: " << frame << " midi beats: " << midi_beats << " speed: " << speed;
+	}
+};
+
 
 MidiClockTicker::MidiClockTicker ()
 	: _midi_port (0)
 	, _ppqn (24)
 	, _last_tick (0.0)
 {
+	_pos.reset (new Position());
+}
+
+MidiClockTicker::~MidiClockTicker()
+{
+	_midi_port = 0;
+	_pos.reset (0);
 }
 
-void MidiClockTicker::set_session (Session* s)
+void
+MidiClockTicker::set_session (Session* s)
 {
 	SessionHandlePtr::set_session (s);
 	
@@ -48,23 +117,67 @@ void MidiClockTicker::set_session (Session* s)
 		 _session->TransportStateChange.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::transport_state_changed, this));
 		 _session->PositionChanged.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::position_changed, this, _1));
 		 _session->TransportLooped.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::transport_looped, this));
+		 _session->Located.connect_same_thread (_session_connections, boost::bind (&MidiClockTicker::session_located, this));
+
 		 update_midi_clock_port();
+		 _pos->sync (_session);
 	 }
 }
 
 void
+MidiClockTicker::session_located()
+{
+	DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Session Located: %1, speed: %2\n", _session->transport_frame(), _session->transport_speed()));
+
+	if (0 == _session || ! _pos->sync (_session)) {
+		return;
+	}
+
+	_last_tick = _pos->frame;
+
+	if (!Config->get_send_midi_clock()) {
+		return;
+	}
+
+	if (_pos->speed == 0.0f) {
+		uint32_t where = llrint (_pos->midi_beats);
+		send_position_event (where, 0);
+	} else if (_pos->speed == 1.0f) {
+#if 1
+		/* Experimental.  To really do this and have accuracy, the
+		   stop/locate/continue sequence would need queued to send immediately
+		   before the next midi clock. */
+
+		send_stop_event (0);
+
+		if (_pos->frame == 0) {
+			send_start_event (0);
+		} else {
+			uint32_t where = llrint (_pos->midi_beats);
+			send_position_event (where, 0);
+			send_continue_event (0);
+		}
+#endif
+	} else {
+		/* Varispeed not supported */
+	}
+}
+
+void
 MidiClockTicker::session_going_away ()
 {
 	SessionHandlePtr::session_going_away();
 	_midi_port = 0;
 }
 
-void MidiClockTicker::update_midi_clock_port()
+void
+MidiClockTicker::update_midi_clock_port()
 {
 	_midi_port = MIDI::Manager::instance()->midi_clock_output_port();
 }
 
-void MidiClockTicker::transport_state_changed()
+void
+MidiClockTicker::transport_state_changed()
 {
 	if (_session->exporting()) {
 		/* no midi clock during export, for now */
@@ -76,57 +189,70 @@ void MidiClockTicker::transport_state_changed()
 		return;
 	}
 
-	float      speed    = _session->transport_speed();
-	framepos_t position = _session->transport_frame();
+	if (! _pos->sync (_session)) {
+		return;
+	}
 
-	DEBUG_TRACE (PBD::DEBUG::MidiClock,
-		     string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n", speed, position, _session->get_play_loop(), position)
-		);
+	DEBUG_TRACE (DEBUG::MidiClock,
+		 string_compose ("Transport state change @ %4, speed: %1 position: %2 play loop: %3\n",
+							_pos->speed, _pos->frame, _session->get_play_loop(), _pos->frame)
+	);
 
-	if (speed == 1.0f) {
-		_last_tick = position;
+	_last_tick = _pos->frame;
+
+	if (! Config->get_send_midi_clock()) {
+		return;
+	}
 
-		if (!Config->get_send_midi_clock())
-			return;
+	if (_pos->speed == 1.0f) {
 
 		if (_session->get_play_loop()) {
 			assert(_session->locations()->auto_loop_location());
-			if (position == _session->locations()->auto_loop_location()->start()) {
+
+			if (_pos->frame == _session->locations()->auto_loop_location()->start()) {
 				send_start_event(0);
 			} else {
 				send_continue_event(0);
 			}
-		} else if (position == 0) {
+
+		} else if (_pos->frame == 0) {
 			send_start_event(0);
 		} else {
 			send_continue_event(0);
 		}
 
-		send_midi_clock_event(0);
+		// send_midi_clock_event (0);
 
-	} else if (speed == 0.0f) {
-		if (!Config->get_send_midi_clock())
-			return;
-
-		send_stop_event(0);
+	} else if (_pos->speed == 0.0f) {
+		send_stop_event (0);
+		send_position_event (llrint (_pos->midi_beats), 0);
 	}
 
-	tick (position);
+	// tick (_pos->frame);
 }
 
-void MidiClockTicker::position_changed (framepos_t position)
+void
+MidiClockTicker::position_changed (framepos_t)
 {
-	DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Position change: %1\n", position));
+#if 0
+	const double speed = _session->transport_speed();
+	DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Transport Position Change: %1, speed: %2\n", position, speed));
+
+	if (speed == 0.0f && Config->get_send_midi_clock()) {
+		send_position_event (position, 0);
+	}
 
 	_last_tick = position;
+#endif
 }
 
-void MidiClockTicker::transport_looped()
+void
+MidiClockTicker::transport_looped()
 {
 	Location* loop_location = _session->locations()->auto_loop_location();
 	assert(loop_location);
 
-	DEBUG_TRACE (PBD::DEBUG::MidiClock,
+	DEBUG_TRACE (DEBUG::MidiClock,
 		     string_compose ("Transport looped, position: %1, loop start: %2, loop end: %3, play loop: %4\n",
 				     _session->transport_frame(), loop_location->start(), loop_location->end(), _session->get_play_loop())
 		);
@@ -143,21 +269,29 @@ void MidiClockTicker::transport_looped()
 	}
 }
 
-void MidiClockTicker::tick (const framepos_t& transport_frame)
+void
+MidiClockTicker::tick (const framepos_t& /* transport_frame */)
 {
 	if (!Config->get_send_midi_clock() || _session == 0 || _session->transport_speed() != 1.0f || _midi_port == 0) {
 		return;
 	}
 
+	MIDI::JackMIDIPort* mp = dynamic_cast<MIDI::JackMIDIPort*> (_midi_port);
+	if (! mp) {
+		return;
+	}
+
+	const framepos_t end = _pos->frame + mp->nframes_this_cycle();
+	double iter = _last_tick;
+
 	while (true) {
-		double next_tick = _last_tick + one_ppqn_in_frames (transport_frame);
-		frameoffset_t next_tick_offset = llrint (next_tick) - transport_frame;
+		double clock_delta = one_ppqn_in_frames (llrint (iter));
+		double next_tick   = iter + clock_delta;
+		frameoffset_t next_tick_offset = llrint (next_tick) - end;
 
-		MIDI::JackMIDIPort* mp = dynamic_cast<MIDI::JackMIDIPort*> (_midi_port);
-		
-		DEBUG_TRACE (PBD::DEBUG::MidiClock,
-			     string_compose ("Transport: %1, last tick time: %2, next tick time: %3, offset: %4, cycle length: %5\n",
-					     transport_frame, _last_tick, next_tick, next_tick_offset, mp ? mp->nframes_this_cycle() : 0));
+		DEBUG_TRACE (DEBUG::MidiClock,
+				 string_compose ("Tick: iter: %1, last tick time: %2, next tick time: %3, offset: %4, cycle length: %5\n",
+						 iter, _last_tick, next_tick, next_tick_offset, mp ? mp->nframes_this_cycle() : 0));
 
 		if (!mp || (next_tick_offset >= mp->nframes_this_cycle())) {
 			break;
@@ -167,11 +301,16 @@ void MidiClockTicker::tick (const framepos_t& transport_frame)
 			send_midi_clock_event (next_tick_offset);
 		}
 
-		_last_tick = next_tick;
+		iter = next_tick;
 	}
+
+	_last_tick  = iter;
+	_pos->frame = end;
 }
 
-double MidiClockTicker::one_ppqn_in_frames (framepos_t transport_position)
+
+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());
@@ -182,47 +321,77 @@ double MidiClockTicker::one_ppqn_in_frames (framepos_t transport_position)
 	return frames_per_quarter_note / double (_ppqn);
 }
 
-void MidiClockTicker::send_midi_clock_event (pframes_t offset)
+void
+MidiClockTicker::send_midi_clock_event (pframes_t offset)
 {
 	if (!_midi_port) {
 		return;
 	}
 
-	DEBUG_TRACE (PBD::DEBUG::MidiClock, string_compose ("Tick with offset %1\n", offset));
+	DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Tick with offset %1\n", offset));
 
 	static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_CLOCK };
 	_midi_port->write (_midi_clock_tick, 1, offset);
 }
 
-void MidiClockTicker::send_start_event (pframes_t offset)
+void
+MidiClockTicker::send_start_event (pframes_t offset)
 {
 	if (!_midi_port) {
 		return;
 	}
 
+	DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Start %1\n", _last_tick));
+
 	static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_START };
 	_midi_port->write (_midi_clock_tick, 1, offset);
 }
 
-void MidiClockTicker::send_continue_event (pframes_t offset)
+void
+MidiClockTicker::send_continue_event (pframes_t offset)
 {
 	if (!_midi_port) {
 		return;
 	}
 
+	DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Continue %1\n", _last_tick));
+
 	static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_CONTINUE };
 	_midi_port->write (_midi_clock_tick, 1, offset);
 }
 
-void MidiClockTicker::send_stop_event (pframes_t offset)
+void
+MidiClockTicker::send_stop_event (pframes_t offset)
 {
 	if (!_midi_port) {
 		return;
 	}
 
+	DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Stop %1\n", _last_tick));
+
 	static uint8_t _midi_clock_tick[1] = { MIDI_CMD_COMMON_STOP };
 	_midi_port->write (_midi_clock_tick, 1, offset);
 }
 
+void
+MidiClockTicker::send_position_event (uint32_t midi_beats, pframes_t offset)
+{
+	if (!_midi_port) {
+		return;
+	}
 
+	/* can only use 14bits worth */
+	if (midi_beats > 0x3fff) {
+		return;
+	}
+
+	/* split midi beats into a 14bit value */
+	MIDI::byte msg[3];
+	msg[0] = MIDI_CMD_COMMON_SONG_POS;
+	msg[1] = midi_beats & 0x007f;
+	msg[2] = midi_beats >> 7;
 
+	_midi_port->midimsg (msg, sizeof (msg), offset);
+
+	DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Song Position Sent: %1\n", midi_beats));
+}
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index dd21819..f028633 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -347,6 +347,9 @@ 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())) {
+			_meter->reset();
+		}
 		return 0;
 	}
 
@@ -395,6 +398,9 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
 		case MonitoringInput:
 			be_silent = false;
 			break;
+		default:
+			be_silent = false;
+			break;
 		}
 	}
 
@@ -405,15 +411,47 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
 	if (be_silent) {
 
 		if (_meter_point == MeterInput) {
-			/* still need input monitoring */
-			_input->process_input (_meter, start_frame, end_frame, nframes);
+			/* still need input monitoring and metering */
+
+			bool const track_rec = _diskstream->record_enabled ();
+			bool const auto_input = _session.config.get_auto_input ();
+			bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
+			bool const tape_machine_mode = Config->get_tape_machine_mode ();
+			bool no_meter = false;
+
+			/* this needs a proper K-map
+			 * and should be separated into a function similar to monitoring_state()
+			 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
+			 *
+			 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
+			 */
+			if (!auto_input && !track_rec) {
+				no_meter=true;
+			}
+			else if (tape_machine_mode && !track_rec && auto_input) {
+				no_meter=true;
+			}
+			else if (!software_monitor && tape_machine_mode && !track_rec) {
+				no_meter=true;
+			}
+			else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
+				no_meter=true;
+			}
+
+			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);
+			} else {
+				_input->process_input (_meter, start_frame, end_frame, nframes);
+			}
 		}
 
 		passthru_silence (start_frame, end_frame, nframes, 0);
 
 	} else {
 
-		BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
+		BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
 		
 		fill_buffers_with_input (bufs, _input, nframes);
 
@@ -439,6 +477,10 @@ Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*
 {
 	Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
 	if (!lm.locked()) {
+		framecnt_t playback_distance = _diskstream->calculate_playback_distance(nframes);
+		if (can_internal_playback_seek(playback_distance)) {
+			internal_playback_seek(playback_distance);
+		}
 		return 0;
 	}
 
@@ -458,7 +500,7 @@ Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*
 
 	framecnt_t playback_distance;
 
-	BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
+	BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
 
 	int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false);
 	need_butler = _diskstream->commit (playback_distance);
@@ -945,6 +987,14 @@ Track::set_monitoring (MonitorChoice mc)
 MeterState
 Track::metering_state () const
 {
-	return _diskstream->record_enabled() ? MeteringInput : MeteringRoute;
+	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());
+	} else {
+		// track no_roll() always metering if
+		rv = _meter_point == MeterInput;
+	}
+	return rv ? MeteringInput : MeteringRoute;
 }
 
diff --git a/libs/ardour/unknown_processor.cc b/libs/ardour/unknown_processor.cc
old mode 100755
new mode 100644
diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc
index aedc789..e7b7648 100644
--- a/libs/ardour/utils.cc
+++ b/libs/ardour/utils.cc
@@ -442,8 +442,12 @@ meter_falloff_to_float (MeterFalloff falloff)
 		return METER_FALLOFF_SLOWEST;
 	case MeterFalloffSlow:
 		return METER_FALLOFF_SLOW;
+	case MeterFalloffSlowish:
+		return METER_FALLOFF_SLOWISH;
 	case MeterFalloffMedium:
 		return METER_FALLOFF_MEDIUM;
+	case MeterFalloffModerate:
+		return METER_FALLOFF_MODERATE;
 	case MeterFalloffFast:
 		return METER_FALLOFF_FAST;
 	case MeterFalloffFaster:
@@ -467,6 +471,12 @@ meter_falloff_from_float (float val)
 	else if (val <= METER_FALLOFF_SLOW) {
 		return MeterFalloffSlow;
 	}
+	else if (val <= METER_FALLOFF_SLOWISH) {
+		return MeterFalloffSlowish;
+	}
+	else if (val <= METER_FALLOFF_MODERATE) {
+		return MeterFalloffModerate;
+	}
 	else if (val <= METER_FALLOFF_MEDIUM) {
 		return MeterFalloffMedium;
 	}
diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc
index c385e71..b80a594 100644
--- a/libs/ardour/vst_plugin.cc
+++ b/libs/ardour/vst_plugin.cc
@@ -197,14 +197,15 @@ int
 VSTPlugin::set_state (const XMLNode& node, int version)
 {
 	LocaleGuard lg (X_("POSIX"));
+	int ret = -1;
 
 	if (node.name() != state_node_name()) {
 		error << _("Bad node sent to VSTPlugin::set_state") << endmsg;
 		return 0;
 	}
 
+#ifndef NO_PLUGIN_STATE
 	XMLNode* child;
-	int ret = -1;
 
 	if ((child = find_named_node (node, X_("chunk"))) != 0) {
 
@@ -237,6 +238,7 @@ VSTPlugin::set_state (const XMLNode& node, int version)
 		ret = 0;
 
 	}
+#endif
 
 	Plugin::set_state (node, version);
 	return ret;
diff --git a/libs/ardour/vumeterdsp.cc b/libs/ardour/vumeterdsp.cc
new file mode 100644
index 0000000..67d48f6
--- /dev/null
+++ b/libs/ardour/vumeterdsp.cc
@@ -0,0 +1,89 @@
+/*
+    Copyright (C) 2012 Fons Adriaensen <fons at linuxaudio.org>
+    Adopted for Ardour 2013 by 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 <math.h>
+#include "ardour/vumeterdsp.h"
+
+
+float Vumeterdsp::_w;
+float Vumeterdsp::_g;
+
+
+Vumeterdsp::Vumeterdsp (void) :
+    _z1 (0),
+    _z2 (0),
+    _m (0),
+    _res (true)
+{
+}
+
+
+Vumeterdsp::~Vumeterdsp (void)
+{
+}
+
+
+void Vumeterdsp::process (float *p, int n)
+{
+    float z1, z2, m, t1, t2;
+
+    z1 = _z1;
+    z2 = _z2;
+    m = _res ? 0: _m;
+    _res = false;
+
+    n /= 4;
+    while (n--)
+    {
+	t2 = z2 / 2;
+	t1 = fabsf (*p++) - t2;
+	z1 += _w * (t1 - z1);
+	t1 = fabsf (*p++) - t2;
+	z1 += _w * (t1 - z1);
+	t1 = fabsf (*p++) - t2;
+	z1 += _w * (t1 - z1);
+	t1 = fabsf (*p++) - t2;
+	z1 += _w * (t1 - z1);
+	z2 += 4 * _w * (z1 - z2);
+	if (z2 > m) m = z2;
+    }
+
+    _z1 = z1;
+    _z2 = z2 + 1e-10f;
+    _m = m;
+}
+
+
+float Vumeterdsp::read (void)
+{
+    _res = true;
+    return _g * _m;
+}
+
+void Vumeterdsp::reset ()
+{
+    _z1 = _z2 = _m = .0f;
+    _res = true;
+}
+
+void Vumeterdsp::init (float fsamp)
+{
+    _w = 11.1f / fsamp; 
+    _g = 1.5f * 1.571f;
+}
diff --git a/libs/ardour/wscript b/libs/ardour/wscript
index 9fe47de..ea08636 100644
--- a/libs/ardour/wscript
+++ b/libs/ardour/wscript
@@ -91,6 +91,8 @@ libardour_sources = [
         'globals.cc',
         'graph.cc',
         'graphnode.cc',
+        'iec1ppmdsp.cc',
+        'iec2ppmdsp.cc',
         'import.cc',
         'instrument_info.cc',
         'internal_return.cc',
@@ -99,10 +101,12 @@ libardour_sources = [
         'io.cc',
         'io_processor.cc',
         'jack_slave.cc',
+        'kmeterdsp.cc',
         'ladspa_plugin.cc',
         'location.cc',
         'location_importer.cc',
         'ltc_slave.cc',
+        'lv2_bundled_search_path.cc',
         'meter.cc',
         'midi_automation_list_binder.cc',
         'midi_buffer.cc',
@@ -204,6 +208,7 @@ libardour_sources = [
         'user_bundle.cc',
         'utils.cc',
         'version.cc',
+        'vumeterdsp.cc',
         'worker.cc'
 ]
 
@@ -438,46 +443,17 @@ def build(bld):
 
     if bld.env['BUILD_TESTS'] and bld.is_defined('HAVE_CPPUNIT'):
         # Unit tests
-        testobj              = bld(features = 'cxx cxxprogram')
-        testobj.source       = '''
-                test/dummy_lxvst.cc
-                test/test_util.cc
-                test/test_needing_session.cc
-                test/audio_region_test.cc
-                test/test_globals.cc
-                test/audio_region_read_test.cc
-                test/automation_list_property_test.cc
-                test/bbt_test.cc
-                test/tempo_test.cc
-                test/interpolation_test.cc
-                test/midi_clock_slave_test.cc
-                test/resampled_source_test.cc
-                test/framewalk_to_beats_test.cc
-                test/framepos_plus_beats_test.cc
-                test/framepos_minus_beats_test.cc
-                test/playlist_layering_test.cc
-                test/playlist_read_test.cc
-                test/playlist_equivalent_regions_test.cc
-                test/control_surfaces_test.cc
-                test/combine_regions_test.cc
-                test/region_naming_test.cc
-                test/load_sessions_test.cc
-                test/mtdm_test.cc
-                test/testrunner.cc
-        '''.split()
-
-# Tests that don't work
-#                test/mantis_3356_test.cc
-
-        testobj.includes     = obj.includes + ['test', '../pbd', '../libltc', '../audiographer']
-        testobj.uselib       = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
-                                'SAMPLERATE','XML','LRDF','COREAUDIO']
-        testobj.use          = ['libpbd','libmidipp','ardour','libltc','libaudiographer']
-        testobj.name         = 'libardour-tests'
-        testobj.target       = 'run-tests'
-        testobj.install_path = ''
-        testobj.defines      = [
-            'PACKAGE="libardour3test"',
+        # only build these common sources once
+        testcommon              = bld(features = 'cxx')
+        testcommon.includes     = obj.includes + ['test', '../pbd', '..']
+        testcommon.source       = ['test/test_globals.cc', 'test/testrunner.cc', 'test/test_needing_session.cc',
+                                   'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc']
+        testcommon.uselib       = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
+                                   'SAMPLERATE','XML','LRDF','COREAUDIO']
+        testcommon.use          = ['libpbd','libmidipp','libevoral','libvamphost',
+                                   'libvampplugin','libtaglib','librubberband',
+                                   'libaudiographer','libltc','ardour']
+        testcommon.defines      = [
             'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
             'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
             'LOCALEDIR="' + os.path.join(
@@ -485,13 +461,58 @@ def build(bld):
             'VAMP_DIR="' + os.path.join(
                 os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
             ]
+        testcommon.name         = 'testcommon'
+
         if bld.env['FPU_OPTIMIZATION']:
-            testobj.source += [ 'sse_functions_xmm.cc' ]
+            testcommon.source += [ 'sse_functions_xmm.cc' ]
             if (bld.env['build_target'] == 'i386'
                 or bld.env['build_target'] == 'i686'):
-                testobj.source += [ 'sse_functions.s' ]
+                testcommon.source += [ 'sse_functions.s' ]
             elif bld.env['build_target'] == 'x86_64':
-                testobj.source += [ 'sse_functions_64bit.s' ]
+                testcommon.source += [ 'sse_functions_64bit.s' ]
+
+        if bld.env['SINGLE_TESTS']:
+            create_ardour_test_program(bld, obj.includes, 'automation_list_property_test', 'test_automation_list_property', ['test/automation_list_property_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'bbt', 'test_bbt', ['test/bbt_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'tempo', 'test_tempo', ['test/tempo_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'interpolation', 'test_interpolation', ['test/interpolation_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'midi_clock_slave', 'test_midi_clock_slave', ['test/midi_clock_slave_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'resampled_source', 'test_resampled_source', ['test/resampled_source_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'framewalk_to_beats', 'test_framewalk_to_beats', ['test/framewalk_to_beats_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'framepos_plus_beats', 'test_framepos_plus_beats', ['test/framepos_plus_beats_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'framepos_minus_beats', 'test_framepos_minus_beats', ['test/framepos_minus_beats_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'playlist_equivalent_regions', 'test_playlist_equivalent_regions', ['test/playlist_equivalent_regions_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'playlist_layering', 'test_playlist_layering', ['test/playlist_layering_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'region_naming', 'test_region_naming', ['test/region_naming_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'control_surface', 'test_control_surfaces', ['test/control_surfaces_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'mtdm_test', 'test_mtdm', ['test/mtdm_test.cc'])
+            create_ardour_test_program(bld, obj.includes, 'session_test', 'test_session', ['test/session_test.cc'])
+
+        test_sources  = '''
+            test/automation_list_property_test.cc
+            test/bbt_test.cc
+            test/tempo_test.cc
+            test/interpolation_test.cc
+            test/midi_clock_slave_test.cc
+            test/resampled_source_test.cc
+            test/framewalk_to_beats_test.cc
+            test/framepos_plus_beats_test.cc
+            test/framepos_minus_beats_test.cc
+            test/playlist_equivalent_regions_test.cc
+            test/playlist_layering_test.cc
+            test/region_naming_test.cc
+            test/control_surfaces_test.cc
+            test/mtdm_test.cc
+            test/session_test.cc
+        '''.split()
+
+# Tests that don't work
+#                test/playlist_read_test.cc
+#                test/audio_region_read_test.cc
+#                test/combine_regions_test.cc
+#                test/mantis_3356_test.cc
+
+        create_ardour_test_program(bld, obj.includes, 'libardour-tests', 'run-tests', test_sources)
 
         # Tester to just load a session
         session_load_tester = bld(features = 'cxx cxxprogram')
@@ -561,6 +582,29 @@ def build(bld):
                 elif bld.env['build_target'] == 'x86_64':
                     profilingobj.source += [ 'sse_functions_64bit.s' ]
 
+def create_ardour_test_program(bld, includes, name, target, sources):
+    testobj              = bld(features = 'cxx cxxprogram')
+    testobj.includes     = includes + ['test', '../pbd', '..']
+    testobj.source       = sources
+    testobj.uselib       = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
+                            'SAMPLERATE','XML','LRDF','COREAUDIO']
+    testobj.use          = ['libpbd','libmidipp','libevoral','libvamphost',
+                            'libvampplugin','libtaglib','librubberband',
+                            'libaudiographer','libltc','ardour','testcommon']
+    testobj.name         = name
+    testobj.target       = target
+    # not sure about install path
+    testobj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
+    testobj.defines      = [
+        'PACKAGE="libardour3test"',
+        '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') + '"',
+        'VAMP_DIR="' + os.path.join(
+            os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
+        ]
+
 def shutdown():
     autowaf.shutdown()
 
diff --git a/libs/audiographer/audiographer/debug_utils.h b/libs/audiographer/audiographer/debug_utils.h
index a1d8259..a1dad22 100644
--- a/libs/audiographer/audiographer/debug_utils.h
+++ b/libs/audiographer/audiographer/debug_utils.h
@@ -3,6 +3,7 @@
 
 #include "flag_field.h"
 
+#include <cstdlib>
 #include <string>
 
 #ifdef __GNUC__
@@ -24,7 +25,7 @@ struct DebugUtils
 		char * res = abi::__cxa_demangle (typeid(obj).name(), 0, 0, &status);
 		if (status == 0) {
 			std::string s(res);
-			free (res);
+			std::free (res);
 			return s;
 		}
 #endif
diff --git a/libs/evoral/evoral/PatchChange.hpp b/libs/evoral/evoral/PatchChange.hpp
index b1a42c6..53b50a3 100644
--- a/libs/evoral/evoral/PatchChange.hpp
+++ b/libs/evoral/evoral/PatchChange.hpp
@@ -123,7 +123,7 @@ public:
 			return time() < o.time();
 		}
 
-		if (bank != o.bank()) {
+		if (bank() != o.bank()) {
 			return bank() < o.bank();
 		}
 
diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp
index b56c234..204ef58 100644
--- a/libs/evoral/src/Sequence.cpp
+++ b/libs/evoral/src/Sequence.cpp
@@ -24,6 +24,10 @@
 #include <stdint.h>
 #include <cstdio>
 
+#if __clang__
+#include "evoral/Note.hpp"
+#endif
+
 #include "pbd/compose.h"
 #include "pbd/error.h"
 
diff --git a/libs/evoral/test/testdata/TakeFive.mid b/libs/evoral/test/testdata/TakeFive.mid
old mode 100755
new mode 100644
diff --git a/libs/gtkmm2ext/barcontroller.cc b/libs/gtkmm2ext/barcontroller.cc
index 50c21e5..693151a 100644
--- a/libs/gtkmm2ext/barcontroller.cc
+++ b/libs/gtkmm2ext/barcontroller.cc
@@ -468,6 +468,12 @@ BarController::expose (GdkEventExpose* /*event*/)
 		break;
 	}
 
+	if (!darea.get_sensitive()) {
+		rounded_rectangle (context, 0, 0, darea.get_width(), darea.get_height(), 3);
+		context->set_source_rgba (0.505, 0.517, 0.525, 0.6);
+		context->fill ();
+	}
+
 	/* draw label */
 
 	double xpos = -1;
diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc
index a2b9e5f..d826def 100644
--- a/libs/gtkmm2ext/fastmeter.cc
+++ b/libs/gtkmm2ext/fastmeter.cc
@@ -23,6 +23,8 @@
 #include <algorithm>
 #include <cstring>
 
+#include <stdlib.h>
+
 #include <gdkmm/rectangle.h>
 #include <gtkmm2ext/fastmeter.h>
 #include <gtkmm2ext/utils.h>
@@ -35,111 +37,287 @@ using namespace Glib;
 using namespace Gtkmm2ext;
 using namespace std;
 
-int FastMeter::min_pattern_metric_size = 10;
+int FastMeter::min_pattern_metric_size = 16;
 int FastMeter::max_pattern_metric_size = 1024;
-
-FastMeter::PatternMap FastMeter::v_pattern_cache;
-FastMeter::PatternMap FastMeter::h_pattern_cache;
-
-FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, int clr0, int clr1, int clr2, int clr3)
+bool FastMeter::no_rgba_overlay = false;
+
+FastMeter::Pattern10Map FastMeter::vm_pattern_cache;
+FastMeter::PatternBgMap FastMeter::vb_pattern_cache;
+
+FastMeter::Pattern10Map FastMeter::hm_pattern_cache;
+FastMeter::PatternBgMap FastMeter::hb_pattern_cache;
+
+FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len,
+		int clr0, int clr1, int clr2, int clr3,
+		int clr4, int clr5, int clr6, int clr7,
+		int clr8, int clr9,
+		int bgc0, int bgc1,
+		int bgh0, int bgh1,
+		float stp0, float stp1,
+		float stp2, float stp3,
+		int styleflags
+		)
+	: pixheight(0)
+	, pixwidth(0)
+	, _styleflags(styleflags)
+	, orientation(o)
+	, hold_cnt(hold)
+	, hold_state(0)
+	, bright_hold(false)
+	, current_level(0)
+	, current_peak(0)
+	, highlight(false)
 {
-	orientation = o;
-	hold_cnt = hold;
-	hold_state = 0;
-	current_peak = 0;
-	current_level = 0;
 	last_peak_rect.width = 0;
 	last_peak_rect.height = 0;
-	_clr0 = clr0;
-	_clr1 = clr1;
-	_clr2 = clr2;
-	_clr3 = clr3;
+	last_peak_rect.x = 0;
+	last_peak_rect.y = 0;
+
+	no_rgba_overlay = ! Glib::getenv("NO_METER_SHADE").empty();
+
+	_clr[0] = clr0;
+	_clr[1] = clr1;
+	_clr[2] = clr2;
+	_clr[3] = clr3;
+	_clr[4] = clr4;
+	_clr[5] = clr5;
+	_clr[6] = clr6;
+	_clr[7] = clr7;
+	_clr[8] = clr8;
+	_clr[9] = clr9;
+
+	_bgc[0] = bgc0;
+	_bgc[1] = bgc1;
+
+	_bgh[0] = bgh0;
+	_bgh[1] = bgh1;
+
+	_stp[0] = stp0;
+	_stp[1] = stp1;
+	_stp[2] = stp2;
+	_stp[3] = stp3;
 
 	set_events (BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK);
 
-	pixrect.x = 0;
-	pixrect.y = 0;
+	pixrect.x = 1;
+	pixrect.y = 1;
 
+	if (!len) {
+		len = 250;
+	}
 	if (orientation == Vertical) {
-		if (!len) {
-			len = 250;
-		}
-		pattern = request_vertical_meter(dimen, len, clr0, clr1, clr2, clr3);
 		pixheight = len;
 		pixwidth = dimen;
+		fgpattern = request_vertical_meter(pixwidth + 2, pixheight + 2, _clr, _stp, _styleflags);
+		bgpattern = request_vertical_background (pixwidth + 2, pixheight + 2, _bgc, false);
+
 	} else {
-		if (!len) {
-			len = 186; // interesting size, eh?
-		}
-		pattern = request_horizontal_meter(len, dimen, clr0, clr1, clr2, clr3);
 		pixheight = dimen;
 		pixwidth = len;
+		fgpattern = request_horizontal_meter(pixwidth + 2, pixheight + 2, _clr, _stp, _styleflags);
+		bgpattern = request_horizontal_background (pixwidth + 2, pixheight + 2, _bgc, false);
 	}
 
-	if (orientation == Vertical) {
-		pixrect.width = min (pixwidth, (gint) dimen);
-		pixrect.height = pixheight;
-	} else {
-		pixrect.width = pixwidth;
-		pixrect.height = min (pixheight, (gint) dimen);
-	}
+	pixrect.width = pixwidth;
+	pixrect.height = pixheight;
+
+	request_width = pixrect.width + 2;
+	request_height= pixrect.height + 2;
+
+	clear ();
+}
 
-	request_width = pixrect.width;
-	request_height= pixrect.height;
+FastMeter::~FastMeter ()
+{
 }
 
 Cairo::RefPtr<Cairo::Pattern>
 FastMeter::generate_meter_pattern (
-		int width, int height, int clr0, int clr1, int clr2, int clr3)
+		int width, int height, int *clr, float *stp, int styleflags, bool horiz)
 {
-	guint8 r0,g0,b0,r1,g1,b1,r2,g2,b2,r3,g3,b3,a;
-
-	/*
-	  The knee is the hard transition point (e.g. at 0dB where the colors
-	  change dramatically to make clipping apparent). Thus there are two
-	  gradients in the pattern, the "normal range" and the "clip range", which
-	  are separated at the knee point.
-
-	  clr0: color at bottom of normal range gradient
-	  clr1: color at top of normal range gradient
-	  clr2: color at bottom of clip range gradient
-	  clr3: color at top of clip range gradient
-	*/
-
-	UINT_TO_RGBA (clr0, &r0, &g0, &b0, &a);
-	UINT_TO_RGBA (clr1, &r1, &g1, &b1, &a);
-	UINT_TO_RGBA (clr2, &r2, &g2, &b2, &a);
-	UINT_TO_RGBA (clr3, &r3, &g3, &b3, &a);
-
-	// fake log calculation copied from log_meter.h
-	// actual calculation:
-	// log_meter(0.0f) =
-	//  def = (0.0f + 20.0f) * 2.5f + 50f
-	//  return def / 115.0f
+	guint8 r,g,b,a;
+	double knee;
+	const double soft =  3.0 / (double) height;
+	const double offs = -1.0 / (double) height;
 
-	const int knee = (int)floor((float)height * 100.0f / 115.0f);
-	cairo_pattern_t* pat = cairo_pattern_create_linear (0.0, 0.0, width, height);
+	cairo_pattern_t* pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, height);
 
 	/*
 	  Cairo coordinate space goes downwards as y value goes up, so invert
 	  knee-based positions by using (1.0 - y)
 	*/
 
-	// Clip range top
+	UINT_TO_RGBA (clr[9], &r, &g, &b, &a); // top/clip
 	cairo_pattern_add_color_stop_rgb (pat, 0.0,
-	                                  r3/255.0, g3/255.0, b3/255.0);
+	                                  r/255.0, g/255.0, b/255.0);
+
+	knee = offs + stp[3] / 115.0f; // -0dB
+
+	UINT_TO_RGBA (clr[8], &r, &g, &b, &a);
+	cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee,
+	                                  r/255.0, g/255.0, b/255.0);
+
+	UINT_TO_RGBA (clr[7], &r, &g, &b, &a);
+	cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft,
+	                                  r/255.0, g/255.0, b/255.0);
+
+	knee = offs + stp[2]/ 115.0f; // -3dB || -2dB
+
+	UINT_TO_RGBA (clr[6], &r, &g, &b, &a);
+	cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee,
+	                                  r/255.0, g/255.0, b/255.0);
+
+	UINT_TO_RGBA (clr[5], &r, &g, &b, &a);
+	cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft,
+	                                  r/255.0, g/255.0, b/255.0);
+
+	knee = offs + stp[1] / 115.0f; // -9dB
+
+	UINT_TO_RGBA (clr[4], &r, &g, &b, &a);
+	cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee,
+	                                  r/255.0, g/255.0, b/255.0);
+
+	UINT_TO_RGBA (clr[3], &r, &g, &b, &a);
+	cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft,
+	                                  r/255.0, g/255.0, b/255.0);
+
+	knee = offs + stp[0] / 115.0f; // -18dB
+
+	UINT_TO_RGBA (clr[2], &r, &g, &b, &a);
+	cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee,
+	                                  r/255.0, g/255.0, b/255.0);
+
+	UINT_TO_RGBA (clr[1], &r, &g, &b, &a);
+	cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft,
+	                                  r/255.0, g/255.0, b/255.0);
+
+	UINT_TO_RGBA (clr[0], &r, &g, &b, &a); // bottom
+	cairo_pattern_add_color_stop_rgb (pat, 1.0,
+	                                  r/255.0, g/255.0, b/255.0);
+
+	if ((styleflags & 1) && !no_rgba_overlay) {
+		cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0);
+		cairo_pattern_add_color_stop_rgba (shade_pattern, 0,   0.0, 0.0, 0.0, 0.15);
+		cairo_pattern_add_color_stop_rgba (shade_pattern, 0.4, 1.0, 1.0, 1.0, 0.05);
+		cairo_pattern_add_color_stop_rgba (shade_pattern, 1,   0.0, 0.0, 0.0, 0.25);
+
+		cairo_surface_t* surface;
+		cairo_t* tc = 0;
+		surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+		tc = cairo_create (surface);
+		cairo_set_source (tc, pat);
+		cairo_rectangle (tc, 0, 0, width, height);
+		cairo_fill (tc);
+		cairo_pattern_destroy (pat);
+
+		cairo_set_source (tc, shade_pattern);
+		cairo_rectangle (tc, 0, 0, width, height);
+		cairo_fill (tc);
+		cairo_pattern_destroy (shade_pattern);
+
+		if (styleflags & 2) { // LED stripes
+			cairo_save (tc);
+			cairo_set_line_width(tc, 1.0);
+			cairo_set_source_rgba(tc, .0, .0, .0, 0.4);
+			//cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE);
+			for (float y=0.5; y < height; y+= 2.0) {
+				cairo_move_to(tc, 0, y);
+				cairo_line_to(tc, width, y);
+				cairo_stroke (tc);
+			}
+			cairo_restore (tc);
+		}
+
+		pat = cairo_pattern_create_for_surface (surface);
+		cairo_destroy (tc);
+		cairo_surface_destroy (surface);
+	}
+
+	if (horiz) {
+		cairo_surface_t* surface;
+		cairo_t* tc = 0;
+		surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, height, width);
+		tc = cairo_create (surface);
+
+		cairo_matrix_t m;
+		cairo_matrix_init_rotate (&m, -M_PI/2.0);
+		cairo_matrix_translate (&m, -height, 0);
+		cairo_pattern_set_matrix (pat, &m);
+		cairo_set_source (tc, pat);
+		cairo_rectangle (tc, 0, 0, height, width);
+		cairo_fill (tc);
+		cairo_pattern_destroy (pat);
+		pat = cairo_pattern_create_for_surface (surface);
+		cairo_destroy (tc);
+		cairo_surface_destroy (surface);
+	}
+	Cairo::RefPtr<Cairo::Pattern> p (new Cairo::Pattern (pat, false));
+
+	return p;
+}
+
+
+Cairo::RefPtr<Cairo::Pattern>
+FastMeter::generate_meter_background (
+		int width, int height, int *clr, bool shade, bool horiz)
+{
+	guint8 r0,g0,b0,r1,g1,b1,a;
+
+	cairo_pattern_t* pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, height);
 
-	// Clip range bottom
-	cairo_pattern_add_color_stop_rgb (pat, 1.0 - (knee/(double)height),
-	                                  r2/255.0, g2/255.0, b2/255.0);
+	UINT_TO_RGBA (clr[0], &r0, &g0, &b0, &a);
+	UINT_TO_RGBA (clr[1], &r1, &g1, &b1, &a);
 
-	// Normal range top (double-stop at knee)
-	cairo_pattern_add_color_stop_rgb (pat, 1.0 - (knee/(double)height),
+	cairo_pattern_add_color_stop_rgb (pat, 0.0,
 	                                  r1/255.0, g1/255.0, b1/255.0);
 
-	// Normal range bottom
 	cairo_pattern_add_color_stop_rgb (pat, 1.0,
-	                                  r0/255.0, g0/255.0, b0/255.0); // top
+	                                  r0/255.0, g0/255.0, b0/255.0);
+
+	if (shade && !no_rgba_overlay) {
+		cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0);
+		cairo_pattern_add_color_stop_rgba (shade_pattern, 0.0, 1.0, 1.0, 1.0, 0.15);
+		cairo_pattern_add_color_stop_rgba (shade_pattern, 0.6, 0.0, 0.0, 0.0, 0.10);
+		cairo_pattern_add_color_stop_rgba (shade_pattern, 1.0, 1.0, 1.0, 1.0, 0.20);
+
+		cairo_surface_t* surface;
+		cairo_t* tc = 0;
+		surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+		tc = cairo_create (surface);
+		cairo_set_source (tc, pat);
+		cairo_rectangle (tc, 0, 0, width, height);
+		cairo_fill (tc);
+		cairo_set_source (tc, shade_pattern);
+		cairo_rectangle (tc, 0, 0, width, height);
+		cairo_fill (tc);
+
+		cairo_pattern_destroy (pat);
+		cairo_pattern_destroy (shade_pattern);
+
+		pat = cairo_pattern_create_for_surface (surface);
+
+		cairo_destroy (tc);
+		cairo_surface_destroy (surface);
+	}
+
+	if (horiz) {
+		cairo_surface_t* surface;
+		cairo_t* tc = 0;
+		surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, height, width);
+		tc = cairo_create (surface);
+
+		cairo_matrix_t m;
+		cairo_matrix_init_rotate (&m, -M_PI/2.0);
+		cairo_matrix_translate (&m, -height, 0);
+		cairo_pattern_set_matrix (pat, &m);
+		cairo_set_source (tc, pat);
+		cairo_rectangle (tc, 0, 0, height, width);
+		cairo_fill (tc);
+		cairo_pattern_destroy (pat);
+		pat = cairo_pattern_create_for_surface (surface);
+		cairo_destroy (tc);
+		cairo_surface_destroy (surface);
+	}
 
 	Cairo::RefPtr<Cairo::Pattern> p (new Cairo::Pattern (pat, false));
 
@@ -148,61 +326,103 @@ FastMeter::generate_meter_pattern (
 
 Cairo::RefPtr<Cairo::Pattern>
 FastMeter::request_vertical_meter(
-		int width, int height, int clr0, int clr1, int clr2, int clr3)
+		int width, int height, int *clr, float *stp, int styleflags)
 {
-	if (height < min_pattern_metric_size)
-		height = min_pattern_metric_size;
-	if (height > max_pattern_metric_size)
-		height = max_pattern_metric_size;
-
-	const PatternMapKey key (width, height, clr0, clr1, clr2, clr3);
-	PatternMap::iterator i;
-	if ((i = v_pattern_cache.find (key)) != v_pattern_cache.end()) {
+	height = max(height, min_pattern_metric_size);
+	height = min(height, max_pattern_metric_size);
+
+	const Pattern10MapKey key (width, height,
+			stp[0], stp[1], stp[2], stp[3],
+			clr[0], clr[1], clr[2], clr[3],
+			clr[4], clr[5], clr[6], clr[7],
+			clr[8], clr[9], styleflags);
+
+	Pattern10Map::iterator i;
+	if ((i = vm_pattern_cache.find (key)) != vm_pattern_cache.end()) {
 		return i->second;
 	}
+	// TODO flush pattern cache if it gets too large
 
 	Cairo::RefPtr<Cairo::Pattern> p = generate_meter_pattern (
-		width, height, clr0, clr1, clr2, clr3);
-	v_pattern_cache[key] = p;
+		width, height, clr, stp, styleflags, false);
+	vm_pattern_cache[key] = p;
 
 	return p;
 }
 
 Cairo::RefPtr<Cairo::Pattern>
-FastMeter::request_horizontal_meter(
-		int width, int height, int clr0, int clr1, int clr2, int clr3)
+FastMeter::request_vertical_background(
+		int width, int height, int *bgc, bool shade)
 {
-	if (width < min_pattern_metric_size)
-		width = min_pattern_metric_size;
-	if (width > max_pattern_metric_size)
-		width = max_pattern_metric_size;
-
-	const PatternMapKey key (width, height, clr0, clr1, clr2, clr3);
-	PatternMap::iterator i;
-	if ((i = h_pattern_cache.find (key)) != h_pattern_cache.end()) {
+	height = max(height, min_pattern_metric_size);
+	height = min(height, max_pattern_metric_size);
+	height += 2;
+
+	const PatternBgMapKey key (width, height, bgc[0], bgc[1], shade);
+	PatternBgMap::iterator i;
+	if ((i = vb_pattern_cache.find (key)) != vb_pattern_cache.end()) {
 		return i->second;
 	}
+	// TODO flush pattern cache if it gets too large
 
-	/* flip height/width so that we get the right pattern */
+	Cairo::RefPtr<Cairo::Pattern> p = generate_meter_background (
+		width, height, bgc, shade, false);
+	vb_pattern_cache[key] = p;
 
-	Cairo::RefPtr<Cairo::Pattern> p = generate_meter_pattern (
-		height, width, clr0, clr1, clr2, clr3);
+	return p;
+}
 
-	/* rotate to make it horizontal */
+Cairo::RefPtr<Cairo::Pattern>
+FastMeter::request_horizontal_meter(
+		int width, int height, int *clr, float *stp, int styleflags)
+{
+	width = max(width, min_pattern_metric_size);
+	width = min(width, max_pattern_metric_size);
 
-	cairo_matrix_t m;
-	cairo_matrix_init_rotate (&m, -M_PI/2.0);
-	cairo_pattern_set_matrix (p->cobj(), &m);
+	const Pattern10MapKey key (width, height,
+			stp[0], stp[1], stp[2], stp[3],
+			clr[0], clr[1], clr[2], clr[3],
+			clr[4], clr[5], clr[6], clr[7],
+			clr[8], clr[9], styleflags);
+
+	Pattern10Map::iterator i;
+	if ((i = hm_pattern_cache.find (key)) != hm_pattern_cache.end()) {
+		return i->second;
+	}
+	// TODO flush pattern cache if it gets too large
 
-	h_pattern_cache[key] = p;
+	Cairo::RefPtr<Cairo::Pattern> p = generate_meter_pattern (
+		height, width, clr, stp, styleflags, true);
 
+	hm_pattern_cache[key] = p;
 	return p;
 }
 
-FastMeter::~FastMeter ()
+Cairo::RefPtr<Cairo::Pattern>
+FastMeter::request_horizontal_background(
+		int width, int height, int *bgc, bool shade)
 {
+	width = max(width, min_pattern_metric_size);
+	width = min(width, max_pattern_metric_size);
+	width += 2;
+
+	const PatternBgMapKey key (width, height, bgc[0], bgc[1], shade);
+	PatternBgMap::iterator i;
+	if ((i = hb_pattern_cache.find (key)) != hb_pattern_cache.end()) {
+		return i->second;
+	}
+	// TODO flush pattern cache if it gets too large
+
+	Cairo::RefPtr<Cairo::Pattern> p = generate_meter_background (
+		height, width, bgc, shade, true);
+
+	hb_pattern_cache[key] = p;
+
+	return p;
 }
 
+
+
 void
 FastMeter::set_hold_count (long val)
 {
@@ -221,68 +441,90 @@ void
 FastMeter::on_size_request (GtkRequisition* req)
 {
 	if (orientation == Vertical) {
-
-		req->height = request_height;
-		req->height = max(req->height, min_pattern_metric_size);
-		req->height = min(req->height, max_pattern_metric_size);
-
-		req->width  = request_width;
-
+		vertical_size_request (req);
 	} else {
+		horizontal_size_request (req);
+	}
+}
 
-		req->width  = request_width;
-		req->width  = max(req->width,  min_pattern_metric_size);
-		req->width  = min(req->width,  max_pattern_metric_size);
+void
+FastMeter::vertical_size_request (GtkRequisition* req)
+{
+	req->height = request_height;
+	req->height = max(req->height, min_pattern_metric_size);
+	req->height = min(req->height, max_pattern_metric_size);
+	req->height += 2;
 
-		req->height = request_height;
-	}
+	req->width  = request_width;
+}
 
+void
+FastMeter::horizontal_size_request (GtkRequisition* req)
+{
+	req->width = request_width;
+	req->width = max(req->width, min_pattern_metric_size);
+	req->width = min(req->width, max_pattern_metric_size);
+	req->width += 2;
+
+	req->height  = request_height;
 }
 
 void
 FastMeter::on_size_allocate (Gtk::Allocation &alloc)
 {
 	if (orientation == Vertical) {
+		vertical_size_allocate (alloc);
+	} else {
+		horizontal_size_allocate (alloc);
+	}
+	queue_draw ();
+}
 
-		if (alloc.get_width() != request_width) {
-			alloc.set_width (request_width);
-		}
+void
+FastMeter::vertical_size_allocate (Gtk::Allocation &alloc)
+{
+	if (alloc.get_width() != request_width) {
+		alloc.set_width (request_width);
+	}
 
-		int h = alloc.get_height();
-		h = max (h, min_pattern_metric_size);
-		h = min (h, max_pattern_metric_size);
+	int h = alloc.get_height();
+	h = max (h, min_pattern_metric_size + 2);
+	h = min (h, max_pattern_metric_size + 2);
 
-		if (h != alloc.get_height()) {
-			alloc.set_height (h);
-		}
+	if (h != alloc.get_height()) {
+		alloc.set_height (h);
+	}
 
-		if (pixheight != h) {
-			pattern = request_vertical_meter (
-				request_width, h, _clr0, _clr1, _clr2, _clr3);
-			pixheight = h;
-			pixwidth  = request_width;
-		}
+	if (pixheight != h) {
+		fgpattern = request_vertical_meter (request_width, h, _clr, _stp, _styleflags);
+		bgpattern = request_vertical_background (request_width, h, highlight ? _bgh : _bgc, highlight);
+		pixheight = h - 2;
+		pixwidth  = request_width - 2;
+	}
 
-	} else {
+	DrawingArea::on_size_allocate (alloc);
+}
 
-		if (alloc.get_height() != request_height) {
-			alloc.set_height(request_height);
-		}
+void
+FastMeter::horizontal_size_allocate (Gtk::Allocation &alloc)
+{
+	if (alloc.get_height() != request_height) {
+		alloc.set_height (request_height);
+	}
 
-		int w = alloc.get_width();
-		w = max (w, min_pattern_metric_size);
-		w = min (w, max_pattern_metric_size);
+	int w = alloc.get_width();
+	w = max (w, min_pattern_metric_size + 2);
+	w = min (w, max_pattern_metric_size + 2);
 
-		if (w != alloc.get_width()) {
-			alloc.set_width (w);
-		}
+	if (w != alloc.get_width()) {
+		alloc.set_width (w);
+	}
 
-		if (pixwidth != w) {
-			pattern = request_horizontal_meter (
-				w, request_height, _clr0, _clr1, _clr2, _clr3);
-			pixheight = request_height;
-			pixwidth  = w;
-		}
+	if (pixwidth != w) {
+		fgpattern = request_horizontal_meter (w, request_height, _clr, _stp, _styleflags);
+		bgpattern = request_horizontal_background (w, request_height, highlight ? _bgh : _bgc, highlight);
+		pixwidth = w - 2;
+		pixheight  = request_height - 2;
 	}
 
 	DrawingArea::on_size_allocate (alloc);
@@ -307,31 +549,36 @@ FastMeter::vertical_expose (GdkEventExpose* ev)
 	GdkRectangle background;
 
 	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);
 
+	cairo_set_source_rgb (cr, 0, 0, 0); // black
+	rounded_rectangle (cr, 0, 0, pixwidth + 2, pixheight + 2, 2);
+	cairo_stroke (cr);
+
 	top_of_meter = (gint) floor (pixheight * current_level);
 
 	/* reset the height & origin of the rect that needs to show the pixbuf
 	 */
 
 	pixrect.height = top_of_meter;
-	pixrect.y = pixheight - top_of_meter;
+	pixrect.y = 1 + pixheight - top_of_meter;
 
-	background.x = 0;
-	background.y = 0;
+	background.x = 1;
+	background.y = 1;
 	background.width = pixrect.width;
 	background.height = pixheight - top_of_meter;
 
 	if (gdk_rectangle_intersect (&background, &ev->area, &intersection)) {
-		cairo_set_source_rgb (cr, 0, 0, 0); // black
+		cairo_set_source (cr, bgpattern->cobj());
 		cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
 		cairo_fill (cr);
 	}
 
 	if (gdk_rectangle_intersect (&pixrect, &ev->area, &intersection)) {
 		// draw the part of the meter image that we need. the area we draw is bounded "in reverse" (top->bottom)
-		cairo_set_source (cr, pattern->cobj());
+		cairo_set_source (cr, fgpattern->cobj());
 		cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
 		cairo_fill (cr);
 	}
@@ -339,13 +586,22 @@ FastMeter::vertical_expose (GdkEventExpose* ev)
 	// draw peak bar
 
 	if (hold_state) {
-		last_peak_rect.x = 0;
+		last_peak_rect.x = 1;
 		last_peak_rect.width = pixwidth;
-		last_peak_rect.y = pixheight - (gint) floor (pixheight * current_peak);
-		last_peak_rect.height = min(3, pixheight - last_peak_rect.y);
+		last_peak_rect.y = max(1, 1 + pixheight - (gint) floor (pixheight * current_peak));
+		if (bright_hold || (_styleflags & 2)) {
+			last_peak_rect.height = max(0, min(3, pixheight - last_peak_rect.y - 1 ));
+		} else {
+			last_peak_rect.height = max(0, min(2, pixheight - last_peak_rect.y - 1 ));
+		}
 
-		cairo_set_source (cr, pattern->cobj());
-		cairo_rectangle (cr, 0, last_peak_rect.y, pixwidth, last_peak_rect.height);
+		cairo_set_source (cr, fgpattern->cobj());
+		cairo_rectangle (cr, last_peak_rect.x, last_peak_rect.y, last_peak_rect.width, last_peak_rect.height);
+
+		if (bright_hold && !no_rgba_overlay) {
+			cairo_fill_preserve (cr);
+			cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.3);
+		}
 		cairo_fill (cr);
 
 	} else {
@@ -367,76 +623,102 @@ FastMeter::horizontal_expose (GdkEventExpose* ev)
 	GdkRectangle background;
 
 	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);
 
+	cairo_set_source_rgb (cr, 0, 0, 0); // black
+	rounded_rectangle (cr, 0, 0, pixwidth + 2, pixheight + 2, 2);
+	cairo_stroke (cr);
+
 	right_of_meter = (gint) floor (pixwidth * current_level);
+
+	/* reset the height & origin of the rect that needs to show the pixbuf
+	 */
+
 	pixrect.width = right_of_meter;
 
-	background.x = 0;
-	background.y = 0;
-	background.width  = pixwidth - right_of_meter;
-	background.height = pixrect.height;
+	background.x = 1 + right_of_meter;
+	background.y = 1;
+	background.width = pixwidth - right_of_meter;
+	background.height = pixheight;
 
 	if (gdk_rectangle_intersect (&background, &ev->area, &intersection)) {
-		cairo_set_source_rgb (cr, 0, 0, 0); // black
-		cairo_rectangle (cr, intersection.x + right_of_meter, intersection.y, intersection.width, intersection.height);
+		cairo_set_source (cr, bgpattern->cobj());
+		cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
 		cairo_fill (cr);
 	}
 
 	if (gdk_rectangle_intersect (&pixrect, &ev->area, &intersection)) {
-		// draw the part of the meter image that we need. the area we draw is bounded "in reverse" (top->bottom)
-		cairo_matrix_t m;
-		cairo_matrix_init_translate (&m, -intersection.x, -intersection.y);
-		cairo_pattern_set_matrix (pattern->cobj(), &m);
-		cairo_set_source (cr, pattern->cobj());
-		cairo_rectangle (cr, intersection.x, intersection.y, pixrect.width, intersection.height);
+		cairo_set_source (cr, fgpattern->cobj());
+		cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
 		cairo_fill (cr);
 	}
 
 	// draw peak bar
-	// XXX: peaks don't work properly
-	/*
-	if (hold_state && intersection.height > 0) {
-		gint x = (gint) floor(pixwidth * current_peak);
 
-		get_window()->draw_pixbuf (get_style()->get_fg_gc(get_state()), pixbuf,
-					   x, intersection.y,
-					   x, intersection.y,
-					   3, intersection.height,
-					   Gdk::RGB_DITHER_NONE, 0, 0);
+	if (hold_state) {
+		last_peak_rect.y = 1;
+		last_peak_rect.height = pixheight;
+		const int xpos = floor (pixwidth * current_peak);
+		if (bright_hold || (_styleflags & 2)) {
+			last_peak_rect.width = min(3, xpos );
+		} else {
+			last_peak_rect.width = min(2, xpos );
+		}
+		last_peak_rect.x = 1 + max(0, xpos - last_peak_rect.width);
+
+		cairo_set_source (cr, fgpattern->cobj());
+		cairo_rectangle (cr, last_peak_rect.x, last_peak_rect.y, last_peak_rect.width, last_peak_rect.height);
+
+		if (bright_hold && !no_rgba_overlay) {
+			cairo_fill_preserve (cr);
+			cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.3);
+		}
+		cairo_fill (cr);
+
+	} else {
+		last_peak_rect.width = 0;
+		last_peak_rect.height = 0;
 	}
-	*/
 
 	cairo_destroy (cr);
 
-	return true;
+	return TRUE;
 }
 
 void
-FastMeter::set (float lvl)
+FastMeter::set (float lvl, float peak)
 {
 	float old_level = current_level;
 	float old_peak = current_peak;
 
-	current_level = lvl;
-
-	if (lvl > current_peak) {
-		current_peak = lvl;
-		hold_state = hold_cnt;
-	}
+	if (pixwidth <= 0 || pixheight <=0) return;
 
-	if (hold_state > 0) {
-		if (--hold_state == 0) {
+	if (peak == -1) {
+		if (lvl >= current_peak) {
 			current_peak = lvl;
+			hold_state = hold_cnt;
 		}
+
+		if (hold_state > 0) {
+			if (--hold_state == 0) {
+				current_peak = lvl;
+			}
+		}
+		bright_hold = false;
+	} else {
+		current_peak = peak;
+		hold_state = 1;
+		bright_hold = true;
 	}
 
-	if (current_level == old_level && current_peak == old_peak && hold_state == 0) {
+	current_level = lvl;
+
+	if (current_level == old_level && current_peak == old_peak && (hold_state == 0 || peak != -1)) {
 		return;
 	}
 
-
 	Glib::RefPtr<Gdk::Window> win;
 
 	if ((win = get_window()) == 0) {
@@ -458,10 +740,10 @@ FastMeter::queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>& win, float ol
 
 	gint new_top = (gint) floor (pixheight * current_level);
 
-	rect.x = 0;
+	rect.x = 1;
 	rect.width = pixwidth;
 	rect.height = new_top;
-	rect.y = pixheight - new_top;
+	rect.y = 1 + pixheight - new_top;
 
 	if (current_level > old_level) {
 		/* colored/pixbuf got larger, just draw the new section */
@@ -504,6 +786,93 @@ FastMeter::queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>& win, float ol
 		gdk_region_union_with_rect (region, &last_peak_rect);
 	}
 
+	if (hold_state && current_peak > 0) {
+		if (!queue) {
+			region = gdk_region_new ();
+			queue = true;
+		}
+		rect.x = 1;
+		rect.y = max(1, 1 + pixheight - (gint) floor (pixheight * current_peak));
+		if (bright_hold || (_styleflags & 2)) {
+			rect.height = max(0, min(3, pixheight - last_peak_rect.y -1 ));
+		} else {
+			rect.height = max(0, min(2, pixheight - last_peak_rect.y -1 ));
+		}
+		rect.width = pixwidth;
+		gdk_region_union_with_rect (region, &rect);
+	}
+
+	if (queue) {
+		gdk_window_invalidate_region (win->gobj(), region, true);
+	}
+	if (region) {
+		gdk_region_destroy(region);
+		region = 0;
+	}
+}
+
+void
+FastMeter::queue_horizontal_redraw (const Glib::RefPtr<Gdk::Window>& win, float old_level)
+{
+	GdkRectangle rect;
+
+	gint new_right = (gint) floor (pixwidth * current_level);
+
+	rect.height = pixheight;
+	rect.y = 1;
+
+	if (current_level > old_level) {
+		rect.x = 1 + pixrect.width;
+		/* colored/pixbuf got larger, just draw the new section */
+		rect.width = new_right - pixrect.width;
+	} else {
+		/* it got smaller, compute the difference */
+		rect.x = 1 + new_right;
+		/* rect.height is the old.x (smaller) minus the new.x (larger) */
+		rect.width = pixrect.width - new_right;
+	}
+
+	GdkRegion* region = 0;
+	bool queue = false;
+
+	if (rect.height != 0) {
+
+		/* ok, first region to draw ... */
+
+		region = gdk_region_rectangle (&rect);
+		queue = true;
+	}
+
+	/* redraw the last place where the last peak hold bar was;
+	   the next expose will draw the new one whether its part of
+	   expose region or not.
+	*/
+
+	if (last_peak_rect.width * last_peak_rect.height != 0) {
+		if (!queue) {
+			region = gdk_region_new ();
+			queue = true;
+		}
+		gdk_region_union_with_rect (region, &last_peak_rect);
+	}
+
+	if (hold_state && current_peak > 0) {
+		if (!queue) {
+			region = gdk_region_new ();
+			queue = true;
+		}
+		rect.y = 1;
+		rect.height = pixheight;
+		const int xpos = floor (pixwidth * current_peak);
+		if (bright_hold || (_styleflags & 2)) {
+			rect.width = min(3, xpos);
+		} else {
+			rect.width = min(2, xpos);
+		}
+		rect.x = 1 + max(0, xpos - rect.width);
+		gdk_region_union_with_rect (region, &rect);
+	}
+
 	if (queue) {
 		gdk_window_invalidate_region (win->gobj(), region, true);
 	}
@@ -514,9 +883,17 @@ FastMeter::queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>& win, float ol
 }
 
 void
-FastMeter::queue_horizontal_redraw (const Glib::RefPtr<Gdk::Window>& /*win*/, float /*old_level*/)
+FastMeter::set_highlight (bool onoff)
 {
-	/* XXX OPTIMIZE (when we have some horizontal meters) */
+	if (highlight == onoff) {
+		return;
+	}
+	highlight = onoff;
+	if (orientation == Vertical) {
+		bgpattern = request_vertical_background (pixwidth + 2, pixheight + 2, highlight ? _bgh : _bgc, highlight);
+	} else {
+		bgpattern = request_horizontal_background (pixwidth + 2, pixheight + 2, highlight ? _bgh : _bgc, highlight);
+	}
 	queue_draw ();
 }
 
diff --git a/libs/gtkmm2ext/gtkmm2ext/dndvbox.h b/libs/gtkmm2ext/gtkmm2ext/dndvbox.h
index bc5ca6c..bbfd183 100644
--- a/libs/gtkmm2ext/gtkmm2ext/dndvbox.h
+++ b/libs/gtkmm2ext/gtkmm2ext/dndvbox.h
@@ -351,7 +351,7 @@ private:
 
 			/* dropped from ourselves onto ourselves */
 
-			T* child = *((T **) selection_data.get_data());
+			T* child = *((T * const *) selection_data.get_data());
 
 			if (drop.first == 0) {
 				_internal_vbox.reorder_child (child->widget(), -1);
diff --git a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h
index 9988d21..8070748 100644
--- a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h
+++ b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h
@@ -36,10 +36,23 @@ class FastMeter : public Gtk::DrawingArea {
 		Vertical
 	};
 
-	FastMeter (long hold_cnt, unsigned long width, Orientation, int len=0, int clrb0=0x00ff00, int clr1=0xffff00, int clr2=0xffaa00, int clr3=0xff0000);
+	FastMeter (long hold_cnt, unsigned long width, Orientation, int len=0,
+			int clr0=0x008800ff, int clr1=0x008800ff,
+			int clr2=0x00ff00ff, int clr3=0x00ff00ff,
+			int clr4=0xffaa00ff, int clr5=0xffaa00ff,
+			int clr6=0xffff00ff, int clr7=0xffff00ff,
+			int clr8=0xff0000ff, int clr9=0xff0000ff,
+			int bgc0=0x333333ff, int bgc1=0x444444ff,
+			int bgh0=0x991122ff, int bgh1=0x551111ff,
+			float stp0 = 55.0, // log_meter(-18);
+			float stp1 = 77.5, // log_meter(-9);
+			float stp2 = 92.5, // log_meter(-3); // 95.0, // log_meter(-2);
+			float stp3 = 100.0,
+			int styleflags = 3
+			);
 	virtual ~FastMeter ();
 
-	void set (float level);
+	void set (float level, float peak = -1);
 	void clear ();
 
 	float get_level() { return current_level; }
@@ -48,18 +61,25 @@ class FastMeter : public Gtk::DrawingArea {
 
 	long hold_count() { return hold_cnt; }
 	void set_hold_count (long);
+	void set_highlight (bool);
+	bool get_highlight () { return highlight; }
 
 protected:
 	bool on_expose_event (GdkEventExpose*);
 	void on_size_request (GtkRequisition*);
 	void on_size_allocate (Gtk::Allocation&);
-
 private:
 
-	Cairo::RefPtr<Cairo::Pattern> pattern;
+	Cairo::RefPtr<Cairo::Pattern> fgpattern;
+	Cairo::RefPtr<Cairo::Pattern> bgpattern;
 	gint pixheight;
 	gint pixwidth;
-	int _clr0, _clr1, _clr2, _clr3;
+
+	float _stp[4];
+	int _clr[10];
+	int _bgc[2];
+	int _bgh[2];
+	int _styleflags;
 
 	Orientation orientation;
 	GdkRectangle pixrect;
@@ -68,37 +88,83 @@ private:
 	gint request_height;
 	unsigned long hold_cnt;
 	unsigned long hold_state;
+	bool bright_hold;
 	float current_level;
 	float current_peak;
 	float current_user_level;
+	bool highlight;
 
 	bool vertical_expose (GdkEventExpose*);
-	bool horizontal_expose (GdkEventExpose*);
+	void vertical_size_request (GtkRequisition*);
+	void vertical_size_allocate (Gtk::Allocation&);
 	void queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>&, float);
+
+	bool horizontal_expose (GdkEventExpose*);
+	void horizontal_size_request (GtkRequisition*);
+	void horizontal_size_allocate (Gtk::Allocation&);
 	void queue_horizontal_redraw (const Glib::RefPtr<Gdk::Window>&, float);
 
+	static bool no_rgba_overlay;
+
 	static Cairo::RefPtr<Cairo::Pattern> generate_meter_pattern (
-		int w, int h, int clr0, int clr1, int clr2, int clr3);
+		int, int, int *, float *, int, bool);
 	static Cairo::RefPtr<Cairo::Pattern> request_vertical_meter (
-		int w, int h, int clr0, int clr1, int clr2, int clr3);
+		int, int, int *, float *, int);
 	static Cairo::RefPtr<Cairo::Pattern> request_horizontal_meter (
-		int w, int h, int clr0, int clr1, int clr2, int clr3);
+		int, int, int *, float *, int);
+
+	static Cairo::RefPtr<Cairo::Pattern> generate_meter_background (
+		int, int, int *, bool, bool);
+	static Cairo::RefPtr<Cairo::Pattern> request_vertical_background (
+		int, int, int *, bool);
+	static Cairo::RefPtr<Cairo::Pattern> request_horizontal_background (
+		int, int, int *, bool);
+
+	struct Pattern10MapKey {
+		Pattern10MapKey (
+				int w, int h,
+				float stp0, float stp1, float stp2, float stp3,
+				int c0, int c1, int c2, int c3,
+				int c4, int c5, int c6, int c7,
+				int c8, int c9, int st
+				)
+			: dim(w, h)
+			, stp(stp0, stp1, stp2, stp3)
+			, cols(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9)
+			, style(st)
+		{}
+		inline bool operator<(const Pattern10MapKey& rhs) const {
+			return (dim < rhs.dim)
+				|| (dim == rhs.dim && stp < rhs.stp)
+				|| (dim == rhs.dim && stp == rhs.stp && cols < rhs.cols)
+				|| (dim == rhs.dim && stp == rhs.stp && cols == rhs.cols && style < rhs.style);
+		}
+		boost::tuple<int, int> dim;
+		boost::tuple<float, float, float, float> stp;
+		boost::tuple<int, int, int, int, int, int, int, int, int, int> cols;
+		int style;
+	};
+	typedef std::map<Pattern10MapKey, Cairo::RefPtr<Cairo::Pattern> > Pattern10Map;
 
-	struct PatternMapKey {
-		PatternMapKey (int w, int h, int c0, int c1, int c2, int c3)
+	struct PatternBgMapKey {
+		PatternBgMapKey (int w, int h, int c0, int c1, bool shade)
 			: dim(w, h)
-			, cols(c0, c1, c2, c3)
+			, cols(c0, c1)
+			, sh(shade)
 		{}
-		inline bool operator<(const PatternMapKey& rhs) const {
-			return (dim < rhs.dim) || (dim == rhs.dim && cols < rhs.cols);
+		inline bool operator<(const PatternBgMapKey& rhs) const {
+			return (dim < rhs.dim) || (dim == rhs.dim && cols < rhs.cols) || (dim == rhs.dim && cols == rhs.cols && (sh && !rhs.sh));
 		}
-		boost::tuple<int, int>           dim;  // width, height
-		boost::tuple<int, int, int, int> cols; // c0, c1, c2, c3
+		boost::tuple<int, int> dim;
+		boost::tuple<int, int> cols;
+		bool sh;
 	};
-	typedef std::map<PatternMapKey, Cairo::RefPtr<Cairo::Pattern> > PatternMap;
+	typedef std::map<PatternBgMapKey, Cairo::RefPtr<Cairo::Pattern> > PatternBgMap;
 
-	static PatternMap v_pattern_cache;
-	static PatternMap h_pattern_cache;
+	static Pattern10Map vm_pattern_cache;
+	static PatternBgMap vb_pattern_cache;
+	static Pattern10Map hm_pattern_cache;
+	static PatternBgMap hb_pattern_cache;
 	static int min_pattern_metric_size; // min dimension for axis that displays the meter level
 	static int max_pattern_metric_size; // max dimension for axis that displays the meter level
 };
diff --git a/libs/gtkmm2ext/gtkmm2ext/keyboard.h b/libs/gtkmm2ext/gtkmm2ext/keyboard.h
index 909f791..2c6b026 100644
--- a/libs/gtkmm2ext/gtkmm2ext/keyboard.h
+++ b/libs/gtkmm2ext/gtkmm2ext/keyboard.h
@@ -59,6 +59,11 @@ class Keyboard : public sigc::trackable, PBD::Stateful
 	static uint32_t GainFineScaleModifier;
 	static uint32_t GainExtraFineScaleModifier;
 
+	// Modifiers for scroll wheel
+	static uint32_t ScrollZoomVerticalModifier;
+	static uint32_t ScrollZoomHorizontalModifier;
+	static uint32_t ScrollHorizontalModifier;
+
 	static const char* primary_modifier_name ();
 	static const char* secondary_modifier_name ();
 	static const char* tertiary_modifier_name ();
@@ -159,7 +164,7 @@ class Keyboard : public sigc::trackable, PBD::Stateful
 	    }
 	};
 
-	sigc::signal0<void> ShiftReleased;
+	sigc::signal0<void> ZoomVerticalModifierReleased;
 
   protected:
 	static Keyboard* _the_keyboard;
diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc
index 9966972..5087f61 100644
--- a/libs/gtkmm2ext/keyboard.cc
+++ b/libs/gtkmm2ext/keyboard.cc
@@ -94,6 +94,11 @@ const char* Keyboard::rangeselect_modifier_name() { return S_("Key|Shift"); }
 guint Keyboard::GainFineScaleModifier = Keyboard::PrimaryModifier;
 guint Keyboard::GainExtraFineScaleModifier = Keyboard::SecondaryModifier;
 
+guint Keyboard::ScrollZoomVerticalModifier = Keyboard::SecondaryModifier;
+guint Keyboard::ScrollZoomHorizontalModifier = Keyboard::PrimaryModifier;
+guint Keyboard::ScrollHorizontalModifier = Keyboard::TertiaryModifier;
+
+
 Keyboard*    Keyboard::_the_keyboard = 0;
 Gtk::Window* Keyboard::current_window = 0;
 bool         Keyboard::_some_magic_widget_has_focus = false;
@@ -243,12 +248,15 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
 		keyval = event->keyval;
 	}
 
-	if (keyval == GDK_Shift_L) {
+	if (event->state & ScrollZoomVerticalModifier) {
 		/* There is a special and rather hacky situation in Editor which makes
-		   it useful to know when a shift key has been released, so emit a signal
-		   here (see Editor::_stepping_axis_view)
+		   it useful to know when the modifier key for vertical zoom has been
+		   released, so emit a signal here (see Editor::_stepping_axis_view).
+		   Note that the state bit for the modifier key is set for the key-up
+		   event when the modifier is released, but not the key-down when it
+		   is pressed, so we get here on key-up, which is what we want.
 		*/
-		ShiftReleased (); /* EMIT SIGNAL */
+		ZoomVerticalModifierReleased (); /* EMIT SIGNAL */
 	}
 
 	if (event->type == GDK_KEY_PRESS) {
diff --git a/libs/gtkmm2ext/persistent_tooltip.cc b/libs/gtkmm2ext/persistent_tooltip.cc
index ea0ffd6..77a8d94 100644
--- a/libs/gtkmm2ext/persistent_tooltip.cc
+++ b/libs/gtkmm2ext/persistent_tooltip.cc
@@ -48,6 +48,9 @@ PersistentTooltip::~PersistentTooltip ()
 bool
 PersistentTooltip::enter (GdkEventCrossing *)
 {
+	if (_timeout.connected()) {
+		leave(NULL);
+	}
 	_timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &PersistentTooltip::timeout), 500);
 	return false;
 }
diff --git a/libs/gtkmm2ext/pixfader.cc b/libs/gtkmm2ext/pixfader.cc
index f4e362b..0185550 100644
--- a/libs/gtkmm2ext/pixfader.cc
+++ b/libs/gtkmm2ext/pixfader.cc
@@ -264,20 +264,20 @@ PixFader::on_expose_event (GdkEventExpose* ev)
 		
 	/* draw the unity-position line if it's not at either end*/
 	if (unity_loc > 0) {
+		context->set_line_width (1);
+		context->set_line_cap (Cairo::LINE_CAP_ROUND);
+		Gdk::Color c = get_style()->get_fg (Gtk::STATE_ACTIVE);
+		context->set_source_rgba (c.get_red_p()*1.5, c.get_green_p()*1.5, c.get_blue_p()*1.5, 0.85);
 		if ( _orien == VERT) {
 			if (unity_loc < h ) {
-					context->set_line_width (1); 
-					context->set_source_rgb (0.0, 1.0, 0.0);
-					context->move_to (1, unity_loc);
-					context->line_to (girth - 2.0, unity_loc);
-					context->stroke ();
+				context->move_to (1.5, unity_loc + .5);
+				context->line_to (girth - 1.5, unity_loc + .5);
+				context->stroke ();
 			}
 		} else {
 			if ( unity_loc < w ){
-				context->set_line_width (1); 
-				context->set_source_rgb (0.0, 1.0, 0.0);
-				context->move_to (unity_loc, 1);
-				context->line_to (unity_loc, girth - 2.0);
+				context->move_to (unity_loc + .5, 1.5);
+				context->line_to (unity_loc + .5, girth - 1.5);
 				context->stroke ();
 			}
 		}
@@ -292,13 +292,15 @@ PixFader::on_expose_event (GdkEventExpose* ev)
 		pango_cairo_show_layout (cr, _layout->gobj());
 	} 
 	
-//	if (Config->get_widget_prelight()) {  //pixfader does not have access to config
-		if (_hovering) {
-			Gtkmm2ext::rounded_rectangle (cr, 0, 0, get_width(), get_height(), 3);
-			cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.1);
-			cairo_fill (cr);
-		}
-//	}
+	if (!get_sensitive()) {
+		Gtkmm2ext::rounded_rectangle (cr, 0, 0, get_width(), get_height(), 3);
+		cairo_set_source_rgba (cr, 0.505, 0.517, 0.525, 0.4);
+		cairo_fill (cr);
+	} else if (_hovering) {
+		Gtkmm2ext::rounded_rectangle (cr, 0, 0, get_width(), get_height(), 3);
+		cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.1);
+		cairo_fill (cr);
+	}
 
 	last_drawn = ds;
 
diff --git a/libs/pbd/cocoa_open_uri.mm b/libs/pbd/cocoa_open_uri.mm
index 2c6822a..90a3995 100644
--- a/libs/pbd/cocoa_open_uri.mm
+++ b/libs/pbd/cocoa_open_uri.mm
@@ -1,6 +1,7 @@
 #include <CoreFoundation/CFLocale.h>
 #import  <CoreFoundation/CFString.h>
 #import  <Foundation/NSString.h>
+#import  <Foundation/NSURL.h>
 #import  <Foundation/NSAutoreleasePool.h>
 #import  <AppKit/NSWorkspace.h>
 
diff --git a/libs/pbd/pbd/ringbuffer.h b/libs/pbd/pbd/ringbuffer.h
index f14fa71..652457b 100644
--- a/libs/pbd/pbd/ringbuffer.h
+++ b/libs/pbd/pbd/ringbuffer.h
@@ -233,6 +233,7 @@ RingBuffer<T>::get_read_vector (RingBuffer<T>::rw_vector *vec)
 		
 		vec->buf[0] = &buf[r];
 		vec->len[0] = free_cnt;
+		vec->buf[1] = 0;
 		vec->len[1] = 0;
 	}
 }
diff --git a/libs/pbd/pbd/stl_delete.h b/libs/pbd/pbd/stl_delete.h
index 66fb027..bca0ea9 100644
--- a/libs/pbd/pbd/stl_delete.h
+++ b/libs/pbd/pbd/stl_delete.h
@@ -20,11 +20,12 @@
 #ifndef __libmisc_stl_delete_h__
 #define __libmisc_stl_delete_h__
 
+
 /* To actually use any of these deletion functions, you need to
    first include the revelant container type header.
 */
-#if defined(_CPP_VECTOR) || defined(_GLIBCXX_VECTOR) || defined(__SGI_STL_VECTOR)
-template<class T> void vector_delete (std::vector<T *> *vec) 
+#if defined(_CPP_VECTOR) || defined(_GLIBCXX_VECTOR) || defined(__SGI_STL_VECTOR) || defined(_LIBCPP_VECTOR)
+template<class T> void vector_delete (std::vector<T *> *vec)
 {
 	typename std::vector<T *>::iterator i;
 	
@@ -33,7 +34,7 @@ template<class T> void vector_delete (std::vector<T *> *vec)
 	}
 	vec->clear ();
 }
-#endif // _CPP_VECTOR || _GLIBCXX_VECTOR || __SGI_STL_VECTOR
+#endif // _CPP_VECTOR || _GLIBCXX_VECTOR || __SGI_STL_VECTOR || _LIBCPP_VECTOR
 
 #if defined(_CPP_MAP) || defined(_GLIBCXX_MAP) || defined(__SGI_STL_MAP)
 template<class K, class T> void map_delete (std::map<K, T *> *m) 
diff --git a/libs/pbd/run-tests.sh b/libs/pbd/run-tests.sh
index c20dc42..4812b96 100755
--- a/libs/pbd/run-tests.sh
+++ b/libs/pbd/run-tests.sh
@@ -7,6 +7,7 @@ fi
 
 srcdir=`pwd`
 cd ../../build
+export PBD_TEST_PATH=$srcdir/test
 
 libs='libs'
 
diff --git a/libs/ardour/buffer.cc b/libs/pbd/test/test_common.cc
similarity index 59%
copy from libs/ardour/buffer.cc
copy to libs/pbd/test/test_common.cc
index 3d47379..16da3ed 100644
--- a/libs/ardour/buffer.cc
+++ b/libs/pbd/test/test_common.cc
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2006 Paul Davis
+    Copyright (C) 2011 Tim Mayberry
 
     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
@@ -16,24 +16,22 @@
     675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#include "ardour/buffer.h"
-#include "ardour/audio_buffer.h"
-#include "ardour/midi_buffer.h"
+#include <glibmm/miscutils.h>
 
-namespace ARDOUR {
+#include "test_common.h"
 
-
-Buffer*
-Buffer::create(DataType type, size_t capacity)
+/**
+ * This allows tests to find the data files they require by looking
+ * in an installed location on windows or by setting an environment variable
+ * on unix.
+ */
+PBD::SearchPath
+test_search_path ()
 {
-	if (type == DataType::AUDIO)
-		return new AudioBuffer(capacity);
-	else if (type == DataType::MIDI)
-		return new MidiBuffer(capacity);
-	else
-		return NULL;
+#ifdef WIN32
+	std::string wsp(g_win32_get_package_installation_directory_of_module(NULL));
+	return Glib::build_filename (wsp,  "pbd_testdata");
+#else
+	return Glib::getenv("PBD_TEST_PATH");
+#endif
 }
-
-
-} // namespace ARDOUR
-
diff --git a/libs/ardour/data_type.cc b/libs/pbd/test/test_common.h
similarity index 71%
copy from libs/ardour/data_type.cc
copy to libs/pbd/test/test_common.h
index 4a43009..0dc62f6 100644
--- a/libs/ardour/data_type.cc
+++ b/libs/pbd/test/test_common.h
@@ -1,6 +1,5 @@
 /*
-    Copyright (C) 2006 Paul Davis
-    Author: David Robillard
+    Copyright (C) 2011 Tim Mayberry
 
     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
@@ -17,15 +16,11 @@
     675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#include "ardour/data_type.h"
-#include "i18n.h"
+#ifndef PBD_TEST_COMMON_H
+#define PBD_TEST_COMMON_H
 
-const char *
-ARDOUR::DataType::to_i18n_string () const
-{
-	switch (_symbol) {
-	case AUDIO: return _("audio");
-	case MIDI: return _("MIDI");
-	default: return _("unknown");
-	}
-}
+#include "pbd/search_path.h"
+
+PBD::SearchPath test_search_path ();
+
+#endif
diff --git a/libs/pbd/test/testrunner.cc b/libs/pbd/test/testrunner.cc
old mode 100755
new mode 100644
diff --git a/libs/pbd/test/xpath.cc b/libs/pbd/test/xpath.cc
index f0e976e..8b80eec 100644
--- a/libs/pbd/test/xpath.cc
+++ b/libs/pbd/test/xpath.cc
@@ -3,18 +3,24 @@
 
 #include "xpath.h"
 #include "pbd/xml++.h"
+#include "pbd/file_utils.h"
+
+#include "test_common.h"
 
 CPPUNIT_TEST_SUITE_REGISTRATION (XPathTest);
 
 using namespace std;
-
-static string const prefix = "../libs/pbd/test/";
+using namespace PBD;
 
 void
 XPathTest::testMisc ()
 {
 //	cout << "Test 1: RosegardenPatchFile.xml: Find all banks in the file" << endl;
-	XMLTree  doc(prefix + "RosegardenPatchFile.xml");
+
+	std::string testdata_path;
+	CPPUNIT_ASSERT (find_file_in_search_path (test_search_path (), "RosegardenPatchFile.xml", testdata_path));
+
+	XMLTree  doc(testdata_path);
 	// "//bank" gives as last element an empty element libxml bug????
 	boost::shared_ptr<XMLSharedNodeList> result = doc.find("//bank[@name]");
 	
@@ -44,7 +50,10 @@ XPathTest::testMisc ()
 //	cout << endl << endl << "Test 3: TestSession.ardour: find all Sources where captured-for contains the string 'Guitar'" << endl;
 	
 	// We have to allocate a new document here, or we get segfaults
-	XMLTree doc2(prefix + "TestSession.ardour");
+	std::string testsession_path;
+	CPPUNIT_ASSERT (find_file_in_search_path (test_search_path (), "TestSession.ardour", testsession_path));
+
+	XMLTree doc2(testsession_path);
 	result = doc2.find("/Session/Sources/Source[contains(@captured-for, 'Guitar')]");
 	assert(result->size() == 16);
 	
@@ -67,8 +76,11 @@ XPathTest::testMisc ()
 	
 //	cout << endl << endl << "Test 5: ProtoolsPatchFile.midnam: Get Banks and Patches for 'Name Set 1'" << endl;
 	
+	std::string testmidnam_path;
+	CPPUNIT_ASSERT (find_file_in_search_path (test_search_path (), "ProtoolsPatchFile.midnam", testmidnam_path));
+
 	// We have to allocate a new document here, or we get segfaults
-	XMLTree doc3(prefix + "ProtoolsPatchFile.midnam");
+	XMLTree doc3(testmidnam_path);
 	result = doc3.find("/MIDINameDocument/MasterDeviceNames/ChannelNameSet[@Name='Name Set 1']/PatchBank");
 	assert(result->size() == 16);
 	
diff --git a/libs/pbd/wscript b/libs/pbd/wscript
index 64dd2a3..0655e1c 100644
--- a/libs/pbd/wscript
+++ b/libs/pbd/wscript
@@ -128,12 +128,13 @@ def build(bld):
     obj.uselib       = 'GLIBMM SIGCPP XML UUID SNDFILE GIOMM'
     if sys.platform == 'darwin':
         TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cc']
-        obj.source += [ 'cocoa_open_uri.mm' ]
+        if 'cocoa_open_uri.mm' not in obj.source:
+            obj.source += [ 'cocoa_open_uri.mm' ]
         obj.uselib += ' OSX'
     obj.vnum         = LIBPBD_LIB_VERSION
     obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
     obj.defines     = ['PACKAGE="' + I18N_PACKAGE + '"']
-
+    
     if bld.env['build_target'] == 'x86_64':
         obj.defines += [ 'USE_X86_64_ASM' ]
 
@@ -147,6 +148,7 @@ def build(bld):
                 test/signals_test.cc
                 test/convert_test.cc
                 test/filesystem_test.cc
+                test/test_common.cc
         '''.split()
         testobj.target       = 'run-tests'
         testobj.includes     = obj.includes + ['test', '../pbd']
diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h
index 5c34227..84dd0d9 100644
--- a/libs/surfaces/osc/osc.h
+++ b/libs/surfaces/osc/osc.h
@@ -188,7 +188,7 @@ 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 *, const char *, lo_arg **argv, int argc, void *data) { \
+        int cb_ ## name (const char *, const char *, lo_arg **argv, int argc, void *) { \
                 if (argc > 1) {                                                \
                  name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type); \
                 }                                                      \
@@ -199,7 +199,7 @@ 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 *, const char *, lo_arg **argv, int argc, void *data) { \
+        int cb_ ## name (const char *, const char *, lo_arg **argv, int argc, void *) { \
                 if (argc > 1) {                                                \
                  name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type,argv[3]->arg4type); \
                 }                                                      \
diff --git a/libs/timecode/src/time.cc b/libs/timecode/src/time.cc
index a0d56c7..6f954a8 100644
--- a/libs/timecode/src/time.cc
+++ b/libs/timecode/src/time.cc
@@ -806,7 +806,7 @@ sample_to_timecode (
 		double timecode_frames_fraction;
 		int64_t timecode_frames_left;
 		const double frames_per_timecode_frame = sample_frame_rate / timecode_frames_per_second;
-		const int64_t frames_per_hour = (int32_t)(3600 * rint(timecode_frames_per_second) * frames_per_timecode_frame);
+		const int64_t frames_per_hour = (int64_t)(3600 * rint(timecode_frames_per_second) * frames_per_timecode_frame);
 
 		timecode.hours = offset_sample / frames_per_hour;
 
@@ -818,7 +818,7 @@ sample_to_timecode (
 		timecode.subframes = (int32_t) rint(timecode_frames_fraction * subframes_per_frame);
 		timecode_frames_left = (int64_t) floor (timecode_frames_left_exact);
 
-		if (timecode.subframes == subframes_per_frame) {
+		if (use_subframes && timecode.subframes == subframes_per_frame) {
 			timecode_frames_left++;
 			timecode.subframes = 0;
 		}
diff --git a/mcp/cmc.device b/mcp/qcon.device
similarity index 71%
copy from mcp/cmc.device
copy to mcp/qcon.device
index b23c849..48c5390 100644
--- a/mcp/cmc.device
+++ b/mcp/qcon.device
@@ -1,13 +1,14 @@
 <MackieProtocolDevice>
-  <Name value="Steinberg CMC series"/>
-  <Strips value="1"/>
+  <Name value="Qcon"/>
+  <Strips value="8"/>
   <Extenders value="0"/>
   <MasterFader value="yes"/>
-  <TimecodeDisplay value="no"/>
+  <TimecodeDisplay value="yes"/>
   <TwoCharacterDisplay value="no"/>
   <GlobalControls value="yes"/>
   <JogWheel value="yes"/>
   <TouchSenseFaders value="yes"/>
+  <LogicControlButtons value="yes"/>
   <usesIPMIDI value="no"/>
   <NoHandShake value="yes"/>
 </MackieProtocolDevice>
diff --git a/tools/linux_packaging/build b/tools/linux_packaging/build
index 2742ca9..72e6025 100755
--- a/tools/linux_packaging/build
+++ b/tools/linux_packaging/build
@@ -14,6 +14,11 @@ ARDOURSTACK_ROOT=$HOME/a3/inst
 # the waf build tree to use when copying built/generated files
 BUILD_ROOT=../../build
 
+# where harvid and xjadeo binaries are cached
+if test -z "$CACHEDIR" -o ! -d "$CACHEDIR"; then
+	CACHEDIR=`pwd`
+fi
+
 MIXBUS=
 WITH_LADSPA=0
 WITH_HARVID=
@@ -24,6 +29,7 @@ EXTERNAL_JACK=
 VENDOR=Ardour ;
 BUILDTYPE=""
 
+
 if [ $# -eq 0 ] ; then
 	echo ""	 
 	echo "ERROR - Please specify build type"
@@ -529,12 +535,24 @@ done
 
 if test x$WITH_HARVID != x ; then
 	cd $APPBIN
-	HARVID_VERSION=$(curl http://ardour.org/files/video-tools/harvid_version.txt)
-	curl -L http://ardour.org/files/video-tools/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz \
-		| tar -x -z --exclude=README --exclude=harvid.1 --strip-components=1 || exit 1
-	XJADEO_VERSION=$(curl http://ardour.org/files/video-tools/xjadeo_version.txt)
-	curl -L http://ardour.org/files/video-tools/xjadeo-${MULTIARCH}-${XJADEO_VERSION}.tgz \
-		| tar -x -z --exclude=README --exclude=xjadeo.1 --strip-components=1 || exit 1
+	HARVID_VERSION=$(curl -s -S http://ardour.org/files/video-tools/harvid_version.txt)
+	XJADEO_VERSION=$(curl -s -S http://ardour.org/files/video-tools/xjadeo_version.txt)
+
+	rsync -Pa \
+		rsync://ardour.org/video-tools/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz \
+		"$CACHEDIR/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz"
+
+	rsync -Pa \
+		rsync://ardour.org/video-tools/xjadeo-${MULTIARCH}-${XJADEO_VERSION}.tgz \
+		"$CACHEDIR/xjadeo-${MULTIARCH}-${XJADEO_VERSION}.tgz"
+
+	tar -x -z \
+		--exclude=README --exclude=harvid.1 --strip-components=1 \
+		-f "$CACHEDIR/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz" || exit 1
+
+	tar -x -z \
+		--exclude=README --exclude=xjadeo.1 --strip-components=1 \
+		-f "$CACHEDIR/xjadeo-${MULTIARCH}-${XJADEO_VERSION}.tgz" || exit 1
 	mv xjadeo xjremote
 	cd -
 fi
diff --git a/tools/osx_packaging/dmgbgxj.png b/tools/osx_packaging/dmgbgxj.png
new file mode 100644
index 0000000..56fbc19
Binary files /dev/null and b/tools/osx_packaging/dmgbgxj.png differ
diff --git a/tools/osx_packaging/dmgbgxj.xcf b/tools/osx_packaging/dmgbgxj.xcf
new file mode 100644
index 0000000..8f978d6
Binary files /dev/null and b/tools/osx_packaging/dmgbgxj.xcf differ
diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build
index f383b00..96ed165 100755
--- a/tools/osx_packaging/osx_build
+++ b/tools/osx_packaging/osx_build
@@ -6,6 +6,11 @@ GTKSTACK_ROOT=$HOME/gtk/inst
 ARDOURSTACK_ROOT=$HOME/a3/inst
 BUILD_ROOT=../../build
 
+# where harvid and xjadeo binaries are cached
+if test -z "$CACHEDIR" -o ! -d "$CACHEDIR"; then
+	CACHEDIR=`pwd`
+fi
+
 SAE=
 MIXBUS=
 WITH_HARVID=
@@ -475,6 +480,7 @@ rm -rf $PRODUCT_PKG_DIR
 mkdir $PRODUCT_PKG_DIR
 
 DMGWINBOTTOM=440
+DMGBACKGROUND=dmgbg.png
 
 if [ x$SAE != x ] ; then
 	
@@ -493,8 +499,9 @@ elif [ x$MIXBUS != x ] ; then
     echo "Creating Mixbus packaging directory"
     mv $APPDIR $PRODUCT_PKG_DIR/
     cp MixBus_Install_QuickStart.pdf "$PRODUCT_PKG_DIR/Mixbus Install & Quick Start Guide.pdf"
-		DMGWINBOTTOM=$[ $DMGWINBOTTOM + 100 ]
-		MIXBUSPOS="set position of item \"MixBus_Install_QuickStart.pdf\" of container window to {90, 180}"
+		DMGWINBOTTOM=580
+		YPOS=$[ $DMGWINBOTTOM - 300 ]
+		MIXBUSPOS="set position of item \"MixBus_Install_QuickStart.pdf\" of container window to {90, ${YPOS}}"
 else 
 
     echo "Creating $APPNAME packaging directory"
@@ -504,16 +511,31 @@ fi
 
 if test x$WITH_HARVID != x ; then
 	echo "installing video tools.."
-	# TODO move files to http://ardour.org/files/ - symlink 'latest'
-	HARVID_VERSION=$(curl http://ardour.org/files/video-tools/harvid_version.txt)
-	XJADEO_VERSION=$(curl http://ardour.org/files/video-tools/xjadeo_version.txt)
+	HARVID_VERSION=$(curl -s -S http://ardour.org/files/video-tools/harvid_version.txt)
+	XJADEO_VERSION=$(curl -s -S http://ardour.org/files/video-tools/xjadeo_version.txt)
 	echo "copying harvid and xjadeo ..."
-  curl -L -o "$PRODUCT_PKG_DIR/xjadeo-${XJADEO_VERSION:1}.dmg" "http://sourceforge.net/projects/xjadeo/files/xjadeo/${XJADEO_VERSION}/jadeo-${XJADEO_VERSION:1}.dmg/download"
-  curl -L "http://ardour.org/files/video-tools/harvid-osx-${HARVID_VERSION}.tgz"\
-		| tar -x -z -C $PRODUCT_PKG_DIR/$APPROOT
-	DMGWINBOTTOM=$[ $DMGWINBOTTOM + 140 ]
+
+	rsync -Pa \
+		rsync://ardour.org/video-tools/harvid-osx-${HARVID_VERSION}.tgz \
+		"$CACHEDIR/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz"
+
+	rsync -Pa \
+		rsync://ardour.org/video-tools/jadeo-${XJADEO_VERSION:1}.dmg \
+		"$CACHEDIR/jadeo-${XJADEO_VERSION:1}.dmg"
+
+	tar -x -z \
+		-C $PRODUCT_PKG_DIR/$APPROOT \
+		-f "$CACHEDIR/harvid-${MULTIARCH}-${HARVID_VERSION}.tgz" || exit 1
+
+	JADEO=$(hdiutil attach "$CACHEDIR/jadeo-${XJADEO_VERSION:1}.dmg" | grep Apple_HFS | grep dev/ | cut -f 3)
+	cp -r "${JADEO}/Jadeo.app" "$PRODUCT_PKG_DIR/"
+	hdiutil detach "${JADEO}"
+
+	DMGWINBOTTOM=580
 	YPOS=$[ $DMGWINBOTTOM - 300 ]
-	XJADEOPOS="set position of item \"xjadeo-${XJADEO_VERSION:1}.dmg\" of container window to {90, ${YPOS}}"
+	XJADEOPOS="set position of item \"Jadeo.app\" of container window to {310, ${YPOS}}"
+
+	DMGBACKGROUND=dmgbgxj.png
 fi
 
 echo "Building DMG ..."
@@ -546,7 +568,7 @@ mount -t hfs "${DiskDevice}" "${MNTPATH}"
 
 cp -r ${PRODUCT_PKG_DIR}/* "${MNTPATH}" || exit
 mkdir "${MNTPATH}/.background"
-cp -vi dmgbg.png "${MNTPATH}/.background/dmgbg.png"
+cp -vi ${DMGBACKGROUND} "${MNTPATH}/.background/dmgbg.png"
 
 echo "setting DMG background ..."
 
@@ -589,7 +611,7 @@ hdiutil eject "${DiskDevice}"
 hdiutil convert -format UDZO "${TMPDMG}" -imagekey zlib-level=9 -o "${UC_DMG}"
 # Delete the temporary files
 rm "$TMPDMG"
-rmdir "$MNTPATH"
+rm -rf "$MNTPATH"
 
 echo "setting file icon ..."
 
diff --git a/tools/valgrind.supp b/tools/valgrind.supp
index 1d1e1bd..8741d9c 100644
--- a/tools/valgrind.supp
+++ b/tools/valgrind.supp
@@ -135,3 +135,17 @@
   fun:ladspa_descriptor
   fun:*
 }
+{
+  <glib utf8>
+  Memcheck:Addr8
+  fun:wcslen
+  fun:wcscoll_l
+  fun:*
+}
+{
+  <glib utf8>
+  Memcheck:Addr8
+  fun:wcslen
+  fun:wcsxfrm_l
+  fun:*
+}
diff --git a/vst/ardevst b/vst/ardevst
index f3db317..f88b174 100755
--- a/vst/ardevst
+++ b/vst/ardevst
@@ -2,4 +2,4 @@
 
 . `dirname "$0"`/../build/gtk2_ardour/ardev_common_waf.sh
 export LD_LIBRARY_PATH=$libs/../gtk2_ardour:$LD_LIBRARY_PATH
-exec wine $libs/../gtk2_ardour/ardour-3.0-vst.exe.so "$@"
+exec wine $libs/../gtk2_ardour/ardour-$ARDOURVERSION-vst.exe.so "$@"
diff --git a/vst/ardourvst.in b/vst/ardourvst.in
index 2a5b811..1a3b82f 100644
--- a/vst/ardourvst.in
+++ b/vst/ardourvst.in
@@ -11,6 +11,6 @@ export ARDOUR_DLL_PATH=@LIBDIR@/ardour3
 export GTK_PATH=@LIBDIR@/ardour3${GTK_PATH:+:$GTK_PATH}
 export LD_LIBRARY_PATH=@LIBDIR@/ardour3${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
 
-exec wine @LIBDIR@/ardour3/ardour-3.0-vst.exe.so "$@"
+exec wine @LIBDIR@/ardour3/ardour- at VERSION@-vst.exe.so "$@"
 
 
diff --git a/wscript b/wscript
index 64e8f29..956925c 100644
--- a/wscript
+++ b/wscript
@@ -8,7 +8,7 @@ import subprocess
 import sys
 
 MAJOR = '3'
-MINOR = '2'
+MINOR = '3'
 VERSION = MAJOR + '.' + MINOR
 
 APPNAME = 'Ardour' + MAJOR
@@ -110,6 +110,22 @@ def set_compiler_flags (conf,opt):
 
     # waf adds -O0 -g itself. thanks waf!
     is_clang = conf.env['CXX'][0].endswith('clang++')
+    
+    if conf.options.cxx11:
+        conf.check_cxx(cxxflags=["-std=c++11"])
+        conf.env.append_unique('CXXFLAGS', ['-std=c++11'])
+        if platform == "darwin":
+            conf.env.append_unique('CXXFLAGS', ['-stdlib=libc++'])
+            conf.env.append_unique('LINKFLAGS', ['-lc++'])
+            # Prevents visibility issues in standard headers
+            conf.define("_DARWIN_C_SOURCE", 1)
+
+    if is_clang and platform == "darwin":
+        # Silence warnings about the non-existing osx clang compiler flags
+        # -compatibility_version and -current_version.  These are Waf
+        # generated and not needed with clang
+        conf.env.append_unique ("CXXFLAGS", ["-Qunused-arguments"])
+        
     if opt.gprofile:
         debug_flags = [ '-pg' ]
 
@@ -357,8 +373,12 @@ def set_compiler_flags (conf,opt):
 
     conf.env.append_value('CFLAGS', '-DBOOST_SYSTEM_NO_DEPRECATED')
     conf.env.append_value('CXXFLAGS', '-DBOOST_SYSTEM_NO_DEPRECATED')
+    # need ISOC9X for llabs()
+    conf.env.append_value('CFLAGS', '-D_ISOC9X_SOURCE')
     conf.env.append_value('CFLAGS', '-D_LARGEFILE64_SOURCE')
     conf.env.append_value('CFLAGS', '-D_FILE_OFFSET_BITS=64')
+    # need ISOC9X for llabs()
+    conf.env.append_value('CXXFLAGS', '-D_ISOC9X_SOURCE')
     conf.env.append_value('CXXFLAGS', '-D_LARGEFILE64_SOURCE')
     conf.env.append_value('CXXFLAGS', '-D_FILE_OFFSET_BITS=64')
 
@@ -429,6 +449,8 @@ def options(opt):
                     help='Raise a floating point exception if a denormal is detected')
     opt.add_option('--test', action='store_true', default=False, dest='build_tests',
                     help="Build unit tests")
+    opt.add_option('--single-tests', action='store_true', default=False, dest='single_tests',
+                    help="Build a single executable for each unit test")
     #opt.add_option('--tranzport', action='store_true', default=False, dest='tranzport',
     # help='Compile with support for Frontier Designs Tranzport (if libusb is available)')
     opt.add_option('--universal', action='store_true', default=False, dest='universal',
@@ -452,6 +474,8 @@ def options(opt):
                     help='directory where Wine\'s Windows header files can be found')
     opt.add_option('--noconfirm', action='store_true', default=False, dest='noconfirm',
                     help='Do not ask questions that require confirmation during the build')
+    opt.add_option('--cxx11', action='store_true', default=False, dest='cxx11',
+                    help='Turn on c++11 compiler flags (-std=c++11)')
     for i in children:
         opt.recurse(i)
 
@@ -513,6 +537,11 @@ def configure(conf):
     else:
         autowaf.display_msg(conf, 'Will build against private Ardour dependency stack', 'no')
         
+    if Options.options.freebie:
+        conf.env.append_value ('CFLAGS', '-DNO_PLUGIN_STATE')
+        conf.env.append_value ('CXXFLAGS', '-DNO_PLUGIN_STATE')
+        conf.define ('NO_PLUGIN_STATE', 1)
+
     if sys.platform == 'darwin':
 
         # this is required, potentially, for anything we link and then relocate into a bundle
@@ -521,9 +550,6 @@ def configure(conf):
         conf.define ('HAVE_COREAUDIO', 1)
         conf.define ('AUDIOUNIT_SUPPORT', 1)
 
-        if not Options.options.freebie:
-            conf.define ('AU_STATE_SUPPORT', 1)
-
         conf.define ('GTKOSX', 1)
         conf.define ('TOP_MENUBAR',1)
         conf.define ('GTKOSX',1)
@@ -562,9 +588,6 @@ def configure(conf):
         conf.env.append_value('LINKFLAGS_AUDIOUNITS', ['-framework', 'AudioToolbox', '-framework', 'AudioUnit'])
         conf.env.append_value('LINKFLAGS_AUDIOUNITS', ['-framework', 'Cocoa'])
 
-        if not Options.options.freebie:
-            conf.env.append_value('CXXFLAGS_AUDIOUNITS', "-DAU_STATE_SUPPORT")
-
         if re.search ("^[1-9][0-9]\.", os.uname()[2]) == None and not Options.options.nocarbon:
             conf.env.append_value('CXXFLAGS_AUDIOUNITS', "-DWITH_CARBON")
             conf.env.append_value('LINKFLAGS_AUDIOUNITS', ['-framework', 'Carbon'])
@@ -627,6 +650,8 @@ def configure(conf):
         conf.env['ENABLE_NLS'] = True
     if opts.build_tests:
         conf.env['BUILD_TESTS'] = opts.build_tests
+    if opts.single_tests:
+        conf.env['SINGLE_TESTS'] = opts.single_tests
     #if opts.tranzport:
     #    conf.env['TRANZPORT'] = 1
     if opts.windows_vst:
@@ -684,7 +709,7 @@ const char* const ardour_config_info = "\\n\\
     write_config_text('Architecture flags',    opts.arch)
     write_config_text('Aubio',                 conf.is_defined('HAVE_AUBIO'))
     write_config_text('AudioUnits',            conf.is_defined('AUDIOUNIT_SUPPORT'))
-    write_config_text('AU state support',      conf.is_defined('AU_STATE_SUPPORT'))
+    write_config_text('No plugin state',       conf.is_defined('NO_PLUGIN_STATE'))
     write_config_text('Build target',          conf.env['build_target'])
     write_config_text('CoreAudio',             conf.is_defined('HAVE_COREAUDIO'))
     write_config_text('Debug RT allocations',  conf.is_defined('DEBUG_RT_ALLOC'))

-- 
ardour3 packaging



More information about the pkg-multimedia-commits mailing list