Index: applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/UtilsPlugin2.java
===================================================================
--- applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/UtilsPlugin2.java	(revision 32096)
+++ applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/UtilsPlugin2.java	(revision 32097)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.plugins.utilsplugin2.multitagger.MultiTagAction;
 import org.openstreetmap.josm.plugins.utilsplugin2.replacegeometry.ReplaceGeometryAction;
+import org.openstreetmap.josm.plugins.utilsplugin2.replacegeometry.ReplaceMembershipAction;
 import org.openstreetmap.josm.plugins.utilsplugin2.search.UtilsSimpleMatchFactory;
 import org.openstreetmap.josm.plugins.utilsplugin2.search.UtilsUnaryMatchFactory;
@@ -73,4 +74,5 @@
 
     JMenuItem replaceGeometry;
+    JMenuItem replaceMembership;
     JMenuItem tagBuffer;
     JMenuItem sourceTag;
@@ -106,4 +108,5 @@
         toolsMenu.addSeparator();
         replaceGeometry = MainMenu.add(toolsMenu, new ReplaceGeometryAction());
+        replaceMembership = MainMenu.add(toolsMenu, new ReplaceMembershipAction());
         extractPoint = MainMenu.add(toolsMenu, new ExtractPointAction());
         tagBuffer = MainMenu.add(toolsMenu, new TagBufferAction());
@@ -148,4 +151,5 @@
 
         replaceGeometry.setEnabled(enabled);
+        replaceMembership.setEnabled(enabled);
         tagBuffer.setEnabled(enabled);
         sourceTag.setEnabled(enabled);
Index: applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/replacegeometry/ReplaceMembershipAction.java
===================================================================
--- applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/replacegeometry/ReplaceMembershipAction.java	(revision 32097)
+++ applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/replacegeometry/ReplaceMembershipAction.java	(revision 32097)
@@ -0,0 +1,88 @@
+package org.openstreetmap.josm.plugins.utilsplugin2.replacegeometry;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.RelationToChildReference;
+import org.openstreetmap.josm.gui.DefaultNameFormatter;
+import org.openstreetmap.josm.gui.Notification;
+import org.openstreetmap.josm.tools.MultiMap;
+
+public class ReplaceMembershipAction extends JosmAction {
+
+    public ReplaceMembershipAction() {
+        super(
+                tr("Replace Membership"), null,
+                tr("In relations where the selected object is member of, replace it with a new one"), null, false);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        final Iterator<OsmPrimitive> selection = getCurrentDataSet().getSelected().iterator();
+        final OsmPrimitive firstObject = selection.next();
+        final OsmPrimitive secondObject = selection.next();
+
+        final ReplaceGeometryCommand command = getReplaceGeometryCommand(firstObject, secondObject);
+        final int affectedRelations = command.getChildren().size();
+        if (affectedRelations > 0) {
+            Main.main.undoRedo.add(command);
+            new Notification(trn("Replaced ''{0}'' by ''{1}'' in {2} relation", "Replaced ''{0}'' by ''{1}'' in {2} relations",
+                    affectedRelations,
+                    firstObject.getDisplayName(DefaultNameFormatter.getInstance()),
+                    secondObject.getDisplayName(DefaultNameFormatter.getInstance()),
+                    affectedRelations
+            )).setIcon(JOptionPane.INFORMATION_MESSAGE).show();
+        } else {
+            new Notification(tr("The first selected object ''{0}'' is not part of any relation",
+                    firstObject.getDisplayName(DefaultNameFormatter.getInstance())
+            )).setIcon(JOptionPane.WARNING_MESSAGE).show();
+        }
+
+    }
+
+    static ReplaceGeometryCommand getReplaceGeometryCommand(OsmPrimitive firstObject, OsmPrimitive secondObject) {
+        final MultiMap<Relation, RelationToChildReference> byRelation = new MultiMap<>();
+        for (final RelationToChildReference i : RelationToChildReference.getRelationToChildReferences(firstObject)) {
+            byRelation.put(i.getParent(), i);
+        }
+
+        final List<Command> commands = new ArrayList<>();
+        for (final Map.Entry<Relation, Set<RelationToChildReference>> i : byRelation.entrySet()) {
+            final Relation oldRelation = i.getKey();
+            final Relation newRelation = new Relation(oldRelation);
+            for (final RelationToChildReference reference : i.getValue()) {
+                newRelation.setMember(reference.getPosition(), new RelationMember(reference.getRole(), secondObject));
+            }
+            commands.add(new ChangeCommand(oldRelation, newRelation));
+        }
+
+        return new ReplaceGeometryCommand(tr("Replace Membership"), commands);
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        updateEnabledState(getCurrentDataSet() == null ? null : getCurrentDataSet().getSelected());
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && selection.size() == 2);
+    }
+}
