Index: gtk2_ardour/editor_ops.cc
===================================================================
--- gtk2_ardour/editor_ops.cc	(revision 3279)
+++ gtk2_ardour/editor_ops.cc	(working copy)
@@ -195,6 +195,61 @@
 }
 
 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.
+		
+		// I have no idea if this is good or right: I really ought to
+		// read up on boost and the standard c++ libs before trying
+		// stuff like this. however, it seems consistent with the
+		// rest of this file, and seems to work. XXX colinf.
+	        
+		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 ();
+}
+
+#if 0
+void
 Editor::destroy_clicked_region ()
 {
 	uint32_t selected = selection->regions.size();
@@ -236,6 +291,7 @@
 		session->destroy_regions (r);
 	} 
 }
+#endif
 
 boost::shared_ptr<Region>
 Editor::select_region_for_operation (int dir, TimeAxisView **tv)
@@ -3099,6 +3155,7 @@
 void
 Editor::remove_region_sync ()
 {
+	// XXX shouldn't this use get_regions_for_action(rs) too?
 	if (clicked_regionview) {
 		boost::shared_ptr<Region> region (clicked_regionview->region());
 		begin_reversible_command (_("remove sync"));
@@ -4396,6 +4453,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.h
===================================================================
--- gtk2_ardour/editor.h	(revision 3279)
+++ gtk2_ardour/editor.h	(working copy)
@@ -995,8 +995,11 @@
 	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 ();
+#if 0
 	void destroy_clicked_region ();
+#endif
 	void edit_region ();
 	void rename_region ();
 	void duplicate_some_regions (RegionSelection&, float times);
Index: gtk2_ardour/editor_selection.cc
===================================================================
--- gtk2_ardour/editor_selection.cc	(revision 3279)
+++ gtk2_ardour/editor_selection.cc	(working copy)
@@ -721,9 +721,11 @@
 	*/
 
 	if (selection->regions.size() > 1) {
-		return true;
+		// return true;
 	}
 	
+	cerr << "selection->regions.size()  = " << selection->regions.size() << endl;
+	
 	begin_reversible_command (_("set selected regions"));
 	
 	selection->set (rv);
Index: gtk2_ardour/editor.cc
===================================================================
--- gtk2_ardour/editor.cc	(revision 3279)
+++ 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.
