Index: gtk2_ardour/editor_ops.cc
===================================================================
--- gtk2_ardour/editor_ops.cc	(revision 3302)
+++ gtk2_ardour/editor_ops.cc	(working copy)
@@ -196,6 +196,55 @@
 }
 
 void
+Editor::remove_region ()
+{
+
+	RegionSelection rs; 
+	get_regions_for_action (rs);
+	
+	if (!session) {
+		return;
+	}
+
+	if (rs.empty()) {
+		cerr << "rs.empty()" << endl;
+		return;
+	}
+
+	begin_reversible_command (_("remove region"));
+
+	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?
+			cerr << "(*i)->region()->playlist() is NULL!" << endl;
+	        	continue;
+	        }
+
+	        XMLNode &before = playlist->get_state();
+		playlist->remove_region (*rl);
+	        XMLNode &after = playlist->get_state();
+		session->add_command(new MementoCommand<Playlist>(*playlist, &before, &after));
+	}
+	commit_reversible_command ();
+}
+
+void
 Editor::destroy_clicked_region ()
 {
 	uint32_t selected = selection->regions.size();
@@ -3136,15 +3185,23 @@
 void
 Editor::remove_region_sync ()
 {
-	if (clicked_regionview) {
-		boost::shared_ptr<Region> region (clicked_regionview->region());
-		begin_reversible_command (_("remove sync"));
-                XMLNode &before = region->playlist()->get_state();
-		region->clear_sync_position ();
-                XMLNode &after = region->playlist()->get_state();
-		session->add_command(new MementoCommand<Playlist>(*(region->playlist()), &before, &after));
-		commit_reversible_command ();
+	RegionSelection rs; 
+
+	get_regions_for_action (rs);
+
+	if (rs.empty()) {
+		return;
 	}
+
+	begin_reversible_command (_("remove sync"));
+	for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
+
+                XMLNode &before = (*i)->region()->playlist()->get_state();
+		(*i)->region()->clear_sync_position ();
+                XMLNode &after = (*i)->region()->playlist()->get_state();
+		session->add_command(new MementoCommand<Playlist>(*((*i)->region()->playlist()), &before, &after));
+	}
+	commit_reversible_command ();
 }
 
 void
@@ -4433,6 +4490,7 @@
 void
 Editor::external_edit_region ()
 {
+	// XXX shouldn't this use get_regions_for_action(rs) too?	
 	if (!clicked_regionview) {
 		return;
 	}
Index: gtk2_ardour/editor.cc
===================================================================
--- gtk2_ardour/editor.cc	(revision 3302)
+++ gtk2_ardour/editor.cc	(working copy)
@@ -1933,7 +1933,7 @@
 	items.push_back (MenuElem (_("Multi-Duplicate"), (bind (mem_fun(*this, &Editor::duplicate_dialog), true))));
 	items.push_back (MenuElem (_("Fill Track"), (mem_fun(*this, &Editor::region_fill_track))));
 	items.push_back (SeparatorElem());
-	items.push_back (MenuElem (_("Remove"), mem_fun(*this, &Editor::remove_clicked_region)));
+	items.push_back (MenuElem (_("Remove"), mem_fun(*this, &Editor::remove_region)));
 
 	/* OK, stick the region submenu at the top of the list, and then add
 	   the standard items.
Index: gtk2_ardour/editor_selection.cc
===================================================================
--- gtk2_ardour/editor_selection.cc	(revision 3302)
+++ gtk2_ardour/editor_selection.cc	(working copy)
@@ -716,14 +716,6 @@
 		return true;
 	}
 
-	/* don't reset the selection if its something other than 
-	   a single other region.
-	*/
-
-	if (selection->regions.size() > 1) {
-		return true;
-	}
-	
 	begin_reversible_command (_("set selected regions"));
 	
 	selection->set (rv);
Index: gtk2_ardour/editor.h
===================================================================
--- gtk2_ardour/editor.h	(revision 3302)
+++ gtk2_ardour/editor.h	(working copy)
@@ -995,6 +995,7 @@
 	void align_selection_relative (ARDOUR::RegionPoint point, nframes_t position, const RegionSelection&);
 	void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position);
 	void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position);
+	void remove_region ();
 	void remove_clicked_region ();
 	void destroy_clicked_region ();
 	void edit_region ();
