diff --git a/gtk2_ardour/audio_region_editor.cc b/gtk2_ardour/audio_region_editor.cc
index c746cbe..b91a7ba 100644
--- a/gtk2_ardour/audio_region_editor.cc
+++ b/gtk2_ardour/audio_region_editor.cc
@@ -45,21 +45,23 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion>
 	: RegionEditor (s),
 	  _region (r),
 	  _region_view (rv),
-	  name_label (_("NAME:")),
-	  audition_button (_("play")),
-	  time_table (5, 2),
+	  name_label (_("Name:")),
+	  audition_button (_("Play")),
+	  time_table (6, 2),
 	  position_clock (X_("regionposition"), true, X_("AudioRegionEditorClock"), true),
 	  end_clock (X_("regionend"), true, X_("AudioRegionEditorClock"), true),
 	  length_clock (X_("regionlength"), true, X_("AudioRegionEditorClock"), true, true),
 	  /* XXX cannot edit sync point or start yet */
-	  sync_offset_clock (X_("regionsyncoffset"), true, X_("AudioRegionEditorClock"), false),
+	  sync_offset_relative_clock (X_("regionsyncoffsetrelative"), true, X_("AudioRegionEditorClock"), false),
+	  sync_offset_absolute_clock (X_("regionsyncoffsetabsolute"), true, X_("AudioRegionEditorClock"), false),
 	  start_clock (X_("regionstart"), true, X_("AudioRegionEditorClock"), false)
 
 {
 	position_clock.set_session (&_session);
 	end_clock.set_session (&_session);
 	length_clock.set_session (&_session);
-	sync_offset_clock.set_session (&_session);
+	sync_offset_relative_clock.set_session (&_session);
+	sync_offset_absolute_clock.set_session (&_session);
 	start_clock.set_session (&_session);
 
 	name_entry.set_name ("AudioRegionEditorEntry");
@@ -84,46 +86,45 @@ AudioRegionEditor::AudioRegionEditor (Session& s, boost::shared_ptr<AudioRegion>
 	top_row_hbox.pack_end (top_row_button_hbox, true, true);
 
 	position_label.set_name ("AudioRegionEditorLabel");
-	position_label.set_text (_("POSITION:"));
+	position_label.set_text (_("Position:"));
 	end_label.set_name ("AudioRegionEditorLabel");
-	end_label.set_text (_("END:"));
+	end_label.set_text (_("End:"));
 	length_label.set_name ("AudioRegionEditorLabel");
-	length_label.set_text (_("LENGTH:"));
-	sync_label.set_name ("AudioRegionEditorLabel");
-	sync_label.set_text (_("SYNC POINT:"));
+	length_label.set_text (_("Length:"));
+	sync_relative_label.set_name ("AudioRegionEditorLabel");
+	sync_relative_label.set_text (_("Sync point (relative to region position):"));
+	sync_absolute_label.set_name ("AudioRegionEditorLabel");
+	sync_absolute_label.set_text (_("Sync point (absolute):"));
 	start_label.set_name ("AudioRegionEditorLabel");
-	start_label.set_text (_("FILE START:"));
+	start_label.set_text (_("File start:"));
 	
 	time_table.set_col_spacings (2);
 	time_table.set_row_spacings (5);
 	time_table.set_border_width (5);
 
-	position_alignment.set (1.0, 0.5);
-	end_alignment.set (1.0, 0.5);
-	length_alignment.set (1.0, 0.5);
-	sync_alignment.set (1.0, 0.5);
-	start_alignment.set (1.0, 0.5);
-
-	position_alignment.add (position_label);
-	end_alignment.add (end_label);
-	length_alignment.add (length_label);
-	sync_alignment.add (sync_label);
-	start_alignment.add (start_label);
-
-	time_table.attach (position_alignment, 0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
+	position_label.set_alignment (1, 0.5);
+	time_table.attach (position_label, 0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
 	time_table.attach (position_clock, 1, 2, 0, 1, Gtk::FILL, Gtk::FILL);
 
-	time_table.attach (end_alignment, 0, 1, 1, 2, Gtk::FILL, Gtk::FILL);
+	end_label.set_alignment (1, 0.5);
+	time_table.attach (end_label, 0, 1, 1, 2, Gtk::FILL, Gtk::FILL);
 	time_table.attach (end_clock, 1, 2, 1, 2, Gtk::FILL, Gtk::FILL);
 
-	time_table.attach (length_alignment, 0, 1, 2, 3, Gtk::FILL, Gtk::FILL);
+	length_label.set_alignment (1, 0.5);
+	time_table.attach (length_label, 0, 1, 2, 3, Gtk::FILL, Gtk::FILL);
 	time_table.attach (length_clock, 1, 2, 2, 3, Gtk::FILL, Gtk::FILL);
 
-	time_table.attach (sync_alignment, 0, 1, 3, 4, Gtk::FILL, Gtk::FILL);
-	time_table.attach (sync_offset_clock, 1, 2, 3, 4, Gtk::FILL, Gtk::FILL);
+	sync_relative_label.set_alignment (1, 0.5);
+	time_table.attach (sync_relative_label, 0, 1, 3, 4, Gtk::FILL, Gtk::FILL);
+	time_table.attach (sync_offset_relative_clock, 1, 2, 3, 4, Gtk::FILL, Gtk::FILL);
+
+	sync_absolute_label.set_alignment (1, 0.5);
+	time_table.attach (sync_absolute_label, 0, 1, 4, 5, Gtk::FILL, Gtk::FILL);
+	time_table.attach (sync_offset_absolute_clock, 1, 2, 4, 5, Gtk::FILL, Gtk::FILL);
 
-	time_table.attach (start_alignment, 0, 1, 4, 5, Gtk::FILL, Gtk::FILL);
-	time_table.attach (start_clock, 1, 2, 4, 5, Gtk::FILL, Gtk::FILL);
+	start_label.set_alignment (1, 0.5);
+	time_table.attach (start_label, 0, 1, 5, 6, Gtk::FILL, Gtk::FILL);
+	time_table.attach (start_clock, 1, 2, 5, 6, Gtk::FILL, Gtk::FILL);
 
 	lower_hbox.pack_start (time_table, true, true);
 	lower_hbox.pack_start (sep1, false, false);
@@ -250,7 +251,7 @@ AudioRegionEditor::end_clock_changed ()
 
 	_session.commit_reversible_command ();
 
-	end_clock.set (_region->position() + _region->length(), true);
+	end_clock.set (_region->position() + _region->length() - 1, true);
 }
 
 void
@@ -264,7 +265,7 @@ AudioRegionEditor::length_clock_changed ()
 
 	if (pl) {
 		XMLNode &before = pl->get_state();
-		_region->trim_end (_region->position() + frames, this);
+		_region->trim_end (_region->position() + frames - 1, this);
 		XMLNode &after = pl->get_state();
 		_session.add_command(new MementoCommand<Playlist>(*pl, &before, &after));
 	}
@@ -297,18 +298,28 @@ AudioRegionEditor::bounds_changed (Change what_changed)
 {
 	if ((what_changed & Change (PositionChanged|LengthChanged)) == Change (PositionChanged|LengthChanged)) {
 		position_clock.set (_region->position(), true);
-		end_clock.set (_region->position() + _region->length(), true);
+		end_clock.set (_region->position() + _region->length() - 1, true);
 		length_clock.set (_region->length(), true);
 	} else if (what_changed & Change (PositionChanged)) {
 		position_clock.set (_region->position(), true);
-		end_clock.set (_region->position() + _region->length(), true);
+		end_clock.set (_region->position() + _region->length() - 1, true);
 	} else if (what_changed & Change (LengthChanged)) {
-		end_clock.set (_region->position() + _region->length(), true);
+		end_clock.set (_region->position() + _region->length() - 1, true);
 		length_clock.set (_region->length(), true);
 	}
 
-	if (what_changed & Region::SyncOffsetChanged) {
-		sync_offset_clock.set (_region->sync_position(), true);
+	if ((what_changed & Region::SyncOffsetChanged) || (what_changed & PositionChanged)) {
+		int dir;
+		nframes_t off = _region->sync_offset (dir);
+		if (dir == -1) {
+			off = -off;
+		}
+
+		if (what_changed & Region::SyncOffsetChanged) {
+			sync_offset_relative_clock.set (off, true);
+		}
+
+		sync_offset_absolute_clock.set (off + _region->position (), true);
 	}
 
 	if (what_changed & StartChanged) {
diff --git a/gtk2_ardour/audio_region_editor.h b/gtk2_ardour/audio_region_editor.h
index 57a9ba4..68ded3e 100644
--- a/gtk2_ardour/audio_region_editor.h
+++ b/gtk2_ardour/audio_region_editor.h
@@ -30,7 +30,6 @@
 #include <gtkmm/arrow.h>
 #include <gtkmm/frame.h>
 #include <gtkmm/table.h>
-#include <gtkmm/alignment.h>
 #include <gtkmm/adjustment.h>
 #include <gtkmm/separator.h>
 #include <gtkmm/spinbutton.h>
@@ -77,18 +76,15 @@ class AudioRegionEditor : public RegionEditor
 	Gtk::Label position_label;
 	Gtk::Label end_label;
 	Gtk::Label length_label;
-	Gtk::Label sync_label;
+	Gtk::Label sync_relative_label;
+	Gtk::Label sync_absolute_label;
 	Gtk::Label start_label;
-	Gtk::Alignment position_alignment;
-	Gtk::Alignment end_alignment;
-	Gtk::Alignment length_alignment;
-	Gtk::Alignment sync_alignment;
-	Gtk::Alignment start_alignment;
 
 	AudioClock position_clock;
 	AudioClock end_clock;
 	AudioClock length_clock;
-	AudioClock sync_offset_clock;
+	AudioClock sync_offset_relative_clock; ///< sync offset relative to the start of the region
+	AudioClock sync_offset_absolute_clock; ///< sync offset relative to the start of the timeline
 	AudioClock start_clock;
 
 	Gtk::HSeparator sep3;
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index b129009..a35000b 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -1934,13 +1934,16 @@ Editor::add_region_context_items (StreamView* sv, boost::shared_ptr<Region> regi
 			bind (mem_fun(*this, &Editor::set_selected_regionview_from_map_event), sv, boost::weak_ptr<Region>(region)));
 		
 		items.push_back (MenuElem (_("Rename"), mem_fun(*this, &Editor::rename_region)));
-		items.push_back (MenuElem (_("Popup region editor"), mem_fun(*this, &Editor::edit_region)));
+		items.push_back (MenuElem (_("Region editor..."), mem_fun(*this, &Editor::edit_region)));
 	}
 
 	items.push_back (MenuElem (_("Raise to top layer"), mem_fun(*this, &Editor::raise_region_to_top)));
 	items.push_back (MenuElem (_("Lower to bottom layer"), mem_fun  (*this, &Editor::lower_region_to_bottom)));
 	items.push_back (SeparatorElem());
 	items.push_back (MenuElem (_("Define sync point"), mem_fun(*this, &Editor::set_region_sync_from_edit_point)));
+	if (_edit_point == EditAtMouse) {
+		items.back ().set_sensitive (false);
+	}
 	items.push_back (MenuElem (_("Remove sync point"), mem_fun(*this, &Editor::remove_region_sync)));
 	items.push_back (SeparatorElem());
 
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index 5826033..3977e5f 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -3250,7 +3250,7 @@ Editor::set_sync_point (nframes64_t where, const RegionSelection& rs)
 		}
 
 		XMLNode &before = region->playlist()->get_state();
-		region->set_sync_position (get_preferred_edit_position());
+		region->set_sync_position (where);
 		XMLNode &after = region->playlist()->get_state();
 		session->add_command(new MementoCommand<Playlist>(*(region->playlist()), &before, &after));
 	}
diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc
index dcca313..a72751a 100644
--- a/libs/ardour/region.cc
+++ b/libs/ardour/region.cc
@@ -826,6 +826,10 @@ Region::trim_front (nframes_t new_position, void *src)
 	}
 }
 
+/** @param new_endpoint New region end point, such that, for example,
+ *  a region at 0 of length 10 has an endpoint of 9.
+ */
+
 void
 Region::trim_end (nframes_t new_endpoint, void *src)
 {
@@ -834,7 +838,7 @@ Region::trim_end (nframes_t new_endpoint, void *src)
 	}
 
 	if (new_endpoint > _position) {
-		trim_to_internal (_position, new_endpoint - _position, this);
+		trim_to_internal (_position, new_endpoint - _position + 1, this);
 		if (!_frozen) {
 			recompute_at_end ();
 		}
