Index: trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 670)
+++ trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 674)
@@ -245,4 +245,5 @@
 			newSelection.add(wayToAdd);
 
+			Boolean warnme=false;
 			// now copy all relations to new way also
 			for (Relation r : Main.ds.relations) {
@@ -256,10 +257,15 @@
 							em.member = wayToAdd;
 							em.role = rm.role;
+							if(em.role.length() > 0)
+								warnme = true;
 							c.members.add(em);
 							commandList.add(new ChangeCommand(r, c));
+							break;
 						}
 					}
 				}
 			}
+			if(warnme)
+				JOptionPane.showMessageDialog(Main.parent, tr("A role based relation membership was copied to both new ways.\nYou should verify this and correct it when necessary."));
 		}
 
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 670)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 674)
@@ -12,4 +12,5 @@
 import java.util.HashSet;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -24,5 +25,7 @@
 import org.openstreetmap.josm.data.osm.WaySegment;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
+import org.openstreetmap.josm.data.osm.visitor.NameVisitor;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.tools.*;
@@ -163,4 +166,33 @@
 	 * nothing to delete.
 	 */
+	private int testRelation(Relation ref, OsmPrimitive osm)
+	{
+		NameVisitor n = new NameVisitor();
+		ref.visit(n);
+		NameVisitor s = new NameVisitor();
+		osm.visit(s);
+		String role = new String();
+		for (RelationMember m : ref.members)
+		{
+			if (m.member == osm)
+			{
+				role = m.role;
+				break;
+			}
+		}
+		if (role.length() > 0)
+		{
+			return JOptionPane.showConfirmDialog(Main.parent,
+			tr("Selection \"{0}\" is used by relation \"{1}\" with role {2}.\nDelete from relation?", s.name, n.name, role),
+			tr("Conflicting relation"), JOptionPane.YES_NO_OPTION);
+		}
+		else
+		{
+			return JOptionPane.showConfirmDialog(Main.parent,
+			tr("Selection \"{0}\" is used by relation \"{1}\".\nDelete from relation?", s.name, n.name),
+			tr("Conflicting relation"), JOptionPane.YES_NO_OPTION);
+		}
+	}
+
 	private Command delete(Collection<OsmPrimitive> selection, boolean alsoDeleteNodesInWay) {
 		if (selection.isEmpty()) return null;
@@ -168,4 +200,5 @@
 		Collection<OsmPrimitive> del = new HashSet<OsmPrimitive>(selection);
 		Collection<Way> waysToBeChanged = new HashSet<Way>();
+		HashMap<OsmPrimitive, Collection<OsmPrimitive>> relationsToBeChanged = new HashMap<OsmPrimitive, Collection<OsmPrimitive>>();
 
 		if (alsoDeleteNodesInWay) {
@@ -197,7 +230,13 @@
 					waysToBeChanged.add((Way) ref);
 				} else if (ref instanceof Relation) {
-					JOptionPane.showMessageDialog(Main.parent,
-						tr("Cannot delete: Selection is used by relation"));
-					return null;
+					if (testRelation((Relation)ref, osm) == JOptionPane.YES_OPTION)
+					{
+						Collection<OsmPrimitive> relset = relationsToBeChanged.get(ref);
+						if(relset == null) relset = new HashSet<OsmPrimitive>();
+						relset.add(osm);
+						relationsToBeChanged.put(ref, relset);
+					}
+					else
+						return null;
 				} else {
 					return null;
@@ -218,6 +257,28 @@
 					if (del.contains(ref)) continue;
 					if (ref instanceof Relation) {
-						JOptionPane.showMessageDialog(Main.parent,
-							tr("Cannot delete: Selection is used by relation"));
+						Boolean found = false;
+						Collection<OsmPrimitive> relset = relationsToBeChanged.get(ref);
+						if (relset == null)
+							relset = new HashSet<OsmPrimitive>();
+						else
+						{
+							for (OsmPrimitive m : relset) {
+								if(m == w)
+								{
+									found = true;
+									break;
+								}
+							}
+						}
+						if (!found)
+						{
+							if (testRelation((Relation)ref, w) == JOptionPane.YES_OPTION)
+							{
+								relset.add(w);
+								relationsToBeChanged.put(ref, relset);
+							}
+							else
+								return null;
+						}
 					} else {
 						return null;
@@ -227,4 +288,25 @@
 				cmds.add(new ChangeCommand(w, wnew));
 			}
+		}
+
+		Iterator<OsmPrimitive> iterator = relationsToBeChanged.keySet().iterator();
+		while(iterator.hasNext())
+		{
+			Relation cur = (Relation)iterator.next();
+			Relation rel = new Relation(cur);
+			for(OsmPrimitive osm : relationsToBeChanged.get(cur))
+			{
+				for (RelationMember rm : rel.members) {
+					if (rm.member == osm)
+					{
+						RelationMember mem = new RelationMember();
+						mem.role = rm.role;
+						mem.member = rm.member;
+						rel.members.remove(mem);
+						break;
+					}
+				}
+			}
+			cmds.add(new ChangeCommand(cur, rel));
 		}
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationEditor.java	(revision 670)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationEditor.java	(revision 674)
@@ -147,7 +147,7 @@
 
 		JLabel help = new JLabel("<html><em>"+
-			"This is the basic relation editor which allows you to change the relation's tags " +
+			tr("This is the basic relation editor which allows you to change the relation's tags " +
 			"as well as the members. In addition to this we should have a smart editor that " +
-			"detects the type of relationship and limits your choices in a sensible way.</em></html>");
+			"detects the type of relationship and limits your choices in a sensible way.")+"</em></html>");
 		
 		getContentPane().add(help, BorderLayout.NORTH);		
@@ -224,4 +224,10 @@
 		}));
 
+		buttonPanel.add(createButton(marktr("Delete Selected"),"deleteselected", tr("Delete all currently selected objects from releation"), KeyEvent.VK_R, new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				deleteSelected();
+			}
+		}));
+
 		buttonPanel.add(createButton(marktr("Delete"),"delete", tr("Remove the member in the current table row from this relation"), KeyEvent.VK_D, new ActionListener() {
 			public void actionPerformed(ActionEvent e) {
@@ -259,5 +265,5 @@
 		refreshTables();
 		
-		setSize(new Dimension(400, 500));
+		setSize(new Dimension(600, 500));
 		setLocationRelativeTo(Main.parent);
 	}
@@ -311,4 +317,21 @@
 		refreshTables();
 	}
+
+	private void deleteSelected() {
+		for (OsmPrimitive p : Main.ds.getSelected()) {
+			Relation c = new Relation(clone);
+			for (RelationMember rm : c.members) {
+				if (rm.member == p)
+				{
+					RelationMember mem = new RelationMember();
+					mem.role = rm.role;
+					mem.member = rm.member;
+					clone.members.remove(mem);
+				}
+			}
+		}
+		refreshTables();
+	}
+
     private void downloadRelationMembers()  {
 
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 670)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 674)
@@ -128,5 +128,5 @@
 	            originalValue = DIFFERENT;
 			}
-			p.add(new JLabel(text), GBC.std().insets(0,0,10,0));
+			p.add(new JLabel(tr(text)+":"), GBC.std().insets(0,0,10,0));
 			p.add(value, GBC.eol().fill(GBC.HORIZONTAL));
 		}
@@ -174,5 +174,5 @@
 							QuadStateCheckBox.State.NOT_SELECTED :
 							QuadStateCheckBox.State.UNSET;
-				check = new QuadStateCheckBox(text, initialState, 
+				check = new QuadStateCheckBox(tr(text), initialState, 
 						new QuadStateCheckBox.State[] { 
 						QuadStateCheckBox.State.SELECTED,
@@ -184,5 +184,5 @@
 				// in "partial" state.
 				initialState = QuadStateCheckBox.State.PARTIAL;
-				check = new QuadStateCheckBox(text, QuadStateCheckBox.State.PARTIAL, 
+				check = new QuadStateCheckBox(tr(text), QuadStateCheckBox.State.PARTIAL, 
 						new QuadStateCheckBox.State[] { 
 						QuadStateCheckBox.State.PARTIAL,
@@ -236,5 +236,5 @@
 			}
 			for (int i=0; i<value_array.length; i++) {
-				lhm.put(value_array[i], display_array[i]);
+				lhm.put(value_array[i], tr(display_array[i]));
 			}
 			for (String s : usage.values) {
@@ -250,5 +250,5 @@
 				combo.setSelectedItem(DIFFERENT); originalValue=DIFFERENT;
 			}
-			p.add(new JLabel(text), GBC.std().insets(0,0,10,0));
+			p.add(new JLabel(tr(text)+":"), GBC.std().insets(0,0,10,0));
 			p.add(combo, GBC.eol().fill(GBC.HORIZONTAL));
 		}
@@ -277,5 +277,5 @@
 
 		@Override public void addToPanel(JPanel p, Collection<OsmPrimitive> sel) {
-			p.add(new JLabel(text), GBC.eol());
+			p.add(new JLabel(tr(text)), GBC.eol());
 		}
 		@Override public void addCommands(Collection<OsmPrimitive> sel, List<Command> cmds) {}
@@ -310,5 +310,5 @@
 	 */
 	public void setName(String name) {
-		putValue(Action.NAME, name);
+		putValue(Action.NAME, tr(name));
 		putValue("toolbar", "tagging_"+name);
 	}
