diff --git a/src/org/openstreetmap/josm/actions/UnGlueRelationAction.java b/src/org/openstreetmap/josm/actions/UnGlueRelationAction.java
new file mode 100644
index 0000000..d8646e2
--- /dev/null
+++ b/src/org/openstreetmap/josm/actions/UnGlueRelationAction.java
@@ -0,0 +1,119 @@
+// License: GPL v2 or later. Copyright 2010 by Kalle Lampila and others
+// See LICENSE file for details.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.event.KeyEvent;
+import java.awt.event.ActionEvent;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.command.AddCommand;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+
+/**
+ * Duplicate nodes, ways and relations that are used by multiple relations.
+ *
+ * Resulting nodes, ways and relations are identical as the orginals.
+ *
+ * @author Kalle Lampila
+ *
+ */
+public class UnGlueRelationAction extends JosmAction {
+
+    /**
+     * Create a new UnGlueRelationAction.
+     */
+    public UnGlueRelationAction() {
+        super(tr("UnGlue Relation"), "ungluerelations", tr("Duplicate nodes, ways and relations that are used by multiple relations."),
+              Shortcut.registerShortcut("tools:ungluerelation", tr("Tool: {0}", tr("UnGlue Relations")), KeyEvent.VK_G, Shortcut.GROUP_EDIT, Shortcut.SHIFT_DEFAULT ), true);
+        putValue("help", ht("/Action/UnGlueRelation"));
+    }
+
+    /**
+     * Called when the action is executed.
+     */
+    public void actionPerformed(ActionEvent e) {
+
+        LinkedList<Command> cmds = new LinkedList<Command>();
+        List<OsmPrimitive> newPrimitives = new LinkedList<OsmPrimitive>();
+        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+
+        for (OsmPrimitive p : selection) {
+            boolean first = true;
+            for (Relation relation : OsmPrimitive.getFilteredList(p.getReferrers(), Relation.class)) {
+                if (relation.isDeleted()) {
+                    continue;
+                }
+                if (!first) {
+                    OsmPrimitive newp = p.makeClone(true);
+                    newPrimitives.add(newp);
+                    cmds.add(new AddCommand(newp));
+                    cmds.add(new ChangeCommand(relation, changeRelationMember(relation, p, newp)));
+                } else {
+                    first = false;
+                }
+            }
+        }
+
+        if (newPrimitives.isEmpty() ) {
+            // error message nothing to do
+        }
+        else {
+            Main.main.undoRedo.add(new SequenceCommand(tr("Unglued Relations"), cmds));
+            //Set selection all primiteves (new and old)
+            newPrimitives.addAll(selection);
+            getCurrentDataSet().setSelected(newPrimitives);
+            Main.map.mapView.repaint();
+        }
+    }
+
+    /**
+     * Change member in relation to another one
+     * @param relation
+     * @param orginalMember member to change
+     * @param newMember
+     * @return new relation were change is made
+     */
+    private Relation changeRelationMember(Relation relation, OsmPrimitive orginalMember, OsmPrimitive newMember) {
+        LinkedList<RelationMember> newrms = new LinkedList<RelationMember>();
+        for (RelationMember rm : relation.getMembers()) {
+            if (rm.getMember() == orginalMember) {
+                newrms.add(new RelationMember(rm.getRole(),newMember));
+            } else {
+                newrms.add(rm);
+            }
+        }
+        Relation newRelation  = new Relation(relation);
+        newRelation.setMembers(newrms);
+        return newRelation;
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
+    }
+
+}
diff --git a/src/org/openstreetmap/josm/data/osm/Node.java b/src/org/openstreetmap/josm/data/osm/Node.java
index 4a185a2..d529d7c 100644
--- a/src/org/openstreetmap/josm/data/osm/Node.java
+++ b/src/org/openstreetmap/josm/data/osm/Node.java
@@ -251,4 +251,9 @@ public final class Node extends OsmPrimitive {
 
         return builder.toString();
     }
+
+    @Override
+    public Node makeClone(boolean clearId) {
+        return new Node(this, clearId);
+    }
 }
diff --git a/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java b/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
index a4ad2e2..f24351f 100644
--- a/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
+++ b/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
@@ -1559,4 +1559,10 @@ abstract public class OsmPrimitive implements Comparable<OsmPrimitive>, Tagged,
         return (int)id;
     }
 
+    /**
+     * Make clone
+     * @param clearId If true, set version to 0 and id to new unique value
+     */
+    abstract public OsmPrimitive makeClone(boolean clearId);
+
 }
diff --git a/src/org/openstreetmap/josm/data/osm/Relation.java b/src/org/openstreetmap/josm/data/osm/Relation.java
index d29712e..dd1b6f2 100644
--- a/src/org/openstreetmap/josm/data/osm/Relation.java
+++ b/src/org/openstreetmap/josm/data/osm/Relation.java
@@ -478,4 +478,9 @@ public final class Relation extends OsmPrimitive {
         }
         return ret;
     }
+
+    @Override
+    public Relation makeClone(boolean clearId) {
+        return new Relation(this, clearId);
+    }
 }
diff --git a/src/org/openstreetmap/josm/data/osm/Way.java b/src/org/openstreetmap/josm/data/osm/Way.java
index 535ef36..235c879 100644
--- a/src/org/openstreetmap/josm/data/osm/Way.java
+++ b/src/org/openstreetmap/josm/data/osm/Way.java
@@ -492,4 +492,9 @@ public final class Way extends OsmPrimitive {
     public boolean isDrawable() {
         return super.isDrawable() && !hasIncompleteNodes();
     }
+
+    @Override
+    public Way makeClone(boolean clearId) {
+        return new Way(this, clearId);
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java
index 9324b48..e3be904 100644
--- a/src/org/openstreetmap/josm/gui/MainMenu.java
+++ b/src/org/openstreetmap/josm/gui/MainMenu.java
@@ -65,6 +65,7 @@ import org.openstreetmap.josm.actions.SimplifyWayAction;
 import org.openstreetmap.josm.actions.SplitWayAction;
 import org.openstreetmap.josm.actions.ToggleGPXLinesAction;
 import org.openstreetmap.josm.actions.UnGlueAction;
+import org.openstreetmap.josm.actions.UnGlueRelationAction;
 import org.openstreetmap.josm.actions.UndoAction;
 import org.openstreetmap.josm.actions.UnselectAllAction;
 import org.openstreetmap.josm.actions.UpdateDataAction;
@@ -151,6 +152,7 @@ public class MainMenu extends JMenuBar {
     public final JosmAction mergeNodes = new MergeNodesAction();
     public final JosmAction joinNodeWay = new JoinNodeWayAction();
     public final JosmAction unglueNodes = new UnGlueAction();
+    public final JosmAction unglueRelationNodes = new UnGlueRelationAction();
     public final JosmAction simplifyWay = new SimplifyWayAction();
     public final JosmAction joinAreas = new JoinAreasAction();
     public final InfoAction info = new InfoAction();
@@ -315,6 +317,7 @@ public class MainMenu extends JMenuBar {
         add(toolsMenu, mergeNodes);
         add(toolsMenu, joinNodeWay);
         add(toolsMenu, unglueNodes);
+        add(toolsMenu, unglueRelationNodes);
         add(toolsMenu, joinAreas);
         toolsMenu.addSeparator();
         add(toolsMenu, info);
