Index: gtk2_ardour/ardour.menus.in
===================================================================
--- gtk2_ardour/ardour.menus.in	(revision 6505)
+++ gtk2_ardour/ardour.menus.in	(working copy)
@@ -170,12 +170,13 @@
                <menuitem action='editor-delete'/>
                <menuitem action='editor-crop'/>
                <menuitem action='split-region'/>
+	       <menuitem action='split-region-at-transients'/>
 	       <menu action="SeparateMenu">
+		    <menuitem action='separate-under-region'/>
 	            <menuitem action='editor-separate'/>
 	            <menuitem action='separate-from-loop'/>
 	            <menuitem action='separate-from-punch'/>
 		    <separator/>
-		    <menuitem action='split-region-at-transients'/>
                </menu>
 	       <menu action="AlignMenu">
 		   <menuitem action='align-regions-start'/>
Index: gtk2_ardour/editor_actions.cc
===================================================================
--- gtk2_ardour/editor_actions.cc	(revision 6505)
+++ gtk2_ardour/editor_actions.cc	(working copy)
@@ -479,20 +479,28 @@
 	act = ActionManager::register_action (editor_actions, "export-range", _("Export Range"), sigc::mem_fun(*this, &Editor::export_range));
 	ActionManager::session_sensitive_actions.push_back (act);
 
+	act = ActionManager::register_action (editor_actions, "separate-under-region", _("Separate Under Selected Regions"), sigc::mem_fun(*this, &Editor::separate_under_selected_regions));
+	ActionManager::session_sensitive_actions.push_back (act);
+
 	act = ActionManager::register_action (editor_actions, "editor-separate", _("Separate"), sigc::mem_fun(*this, &Editor::separate_region_from_selection));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::mouse_edit_point_requires_canvas_actions.push_back (act);
+	
 	act = ActionManager::register_action (editor_actions, "separate-from-punch", _("Separate Using Punch Range"), sigc::mem_fun(*this, &Editor::separate_region_from_punch));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::mouse_edit_point_requires_canvas_actions.push_back (act);
+	
 	act = ActionManager::register_action (editor_actions, "separate-from-loop", _("Separate Using Loop Range"), sigc::mem_fun(*this, &Editor::separate_region_from_loop));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::mouse_edit_point_requires_canvas_actions.push_back (act);
+	
 	act = ActionManager::register_action (editor_actions, "editor-crop", _("Crop"), sigc::mem_fun(*this, &Editor::crop_region_to_selection));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::mouse_edit_point_requires_canvas_actions.push_back (act);
+	
 	act = ActionManager::register_action (editor_actions, "editor-cut", _("Cut"), sigc::mem_fun(*this, &Editor::cut));
 	ActionManager::session_sensitive_actions.push_back (act);
+	
 	/* Note: for now, editor-delete does the exact same thing as editor-cut */
 	act = ActionManager::register_action (editor_actions, "editor-delete", _("Delete"), sigc::mem_fun(*this, &Editor::cut));
 	ActionManager::session_sensitive_actions.push_back (act);
Index: gtk2_ardour/editor_ops.cc
===================================================================
--- gtk2_ardour/editor_ops.cc	(revision 6505)
+++ gtk2_ardour/editor_ops.cc	(working copy)
@@ -2822,6 +2822,7 @@
 
 						sigc::connection c = rtv->view()->RegionViewAdded.connect (
 								sigc::mem_fun(*this, &Editor::collect_new_region_view));
+
 						latest_regionviews.clear ();
 
 						playlist->partition ((nframes64_t)((*t).start * speed),
@@ -2863,6 +2864,11 @@
 	}
 }
 
+struct PlaylistState {
+    boost::shared_ptr<Playlist> playlist;
+    XMLNode*  before;
+};
+
 /** Take tracks from get_tracks_for_range_action and cut any regions
  *  on those tracks so that the tracks are empty over the time
  *  selection.
@@ -2928,7 +2934,86 @@
 	separate_regions_between (ts);
 }
 
+/** Separate regions under the selected region */
 void
+Editor::separate_under_selected_regions ()
+{
+	RegionSelection rs;
+	get_regions_for_action (rs);
+	
+	vector<PlaylistState> playlists;
+
+	if (!_session) {
+		return;
+	}
+
+	if (rs.empty()) {
+		return;
+	}
+
+	begin_reversible_command (_("separate region under"));
+
+	list<boost::shared_ptr<Region> > regions_to_remove;
+
+	for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
+		// we can't just remove the region(s) in this loop because
+		// this removes them from the RegionSelection, and they thus
+		// disappear from underneath the iterator, and the ++i above
+		// SEGVs in a puzzling fashion.
+
+		// so, first iterate over the regions to be removed from rs and
+		// add them to the regions_to_remove list, and then
+		// iterate over the list to actually remove them.
+
+		regions_to_remove.push_back ((*i)->region());
+	}
+
+	for (list<boost::shared_ptr<Region> >::iterator rl = regions_to_remove.begin(); rl != regions_to_remove.end(); ++rl) {
+
+		boost::shared_ptr<Playlist> playlist = (*rl)->playlist();
+
+	        if (!playlist) {
+			// is this check necessary?
+	        	continue;
+	        }
+
+		vector<PlaylistState>::iterator i;
+
+		//only take state if this is a new playlist.
+		for (i = playlists.begin(); i != playlists.end(); ++i) {
+			if ((*i).playlist == playlist) {
+				break;
+			}
+		}
+
+		if (i == playlists.end()) {
+
+			PlaylistState before;
+			before.playlist = playlist;
+			before.before = &playlist->get_state();
+
+			playlist->freeze ();
+			playlists.push_back(before);
+		}
+
+		//Partition on the region bounds
+		playlist->partition ((*rl)->first_frame() - 1, (*rl)->last_frame() + 1, true);
+		
+		//Re-add region that was just removed due to the partition operation
+		playlist->add_region( (*rl), (*rl)->first_frame() );
+	}
+
+	vector<PlaylistState>::iterator pl;
+
+	for (pl = playlists.begin(); pl != playlists.end(); ++pl) {
+		(*pl).playlist->thaw ();
+		_session->add_command(new MementoCommand<Playlist>(*(*pl).playlist, (*pl).before, &(*pl).playlist->get_state()));
+	}
+
+	commit_reversible_command ();
+}
+
+void
 Editor::crop_region_to_selection ()
 {
 	if (!selection->time.empty()) {
@@ -3954,11 +4039,8 @@
 	}
 }
 
-struct PlaylistState {
-    boost::shared_ptr<Playlist> playlist;
-    XMLNode*  before;
-};
 
+
 struct lt_playlist {
     bool operator () (const PlaylistState& a, const PlaylistState& b) {
 	    return a.playlist < b.playlist;
@@ -4341,7 +4423,7 @@
 
  		playlist = (*i)->region()->playlist();
                 XMLNode &before = playlist->get_state();
-		playlist->duplicate (r, end_frame + (r->first_frame() - start_frame) + 1, times);
+		playlist->duplicate (r, end_frame + (r->first_frame() - start_frame), times);
 		_session->add_command(new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
 
 		c.disconnect ();
Index: gtk2_ardour/editor.h
===================================================================
--- gtk2_ardour/editor.h	(revision 6505)
+++ gtk2_ardour/editor.h	(working copy)
@@ -233,6 +233,7 @@
 	void new_region_from_selection ();
 	void separate_regions_between (const TimeSelection&);
 	void separate_region_from_selection ();
+	void separate_under_selected_regions ();
 	void separate_region_from_punch ();
 	void separate_region_from_loop ();
 	void separate_regions_using_location (ARDOUR::Location&);