diff --git a/src/org/openstreetmap/josm/actions/relation/EditLastRelationAction.java b/src/org/openstreetmap/josm/actions/relation/EditLastRelationAction.java
new file mode 100644
index 0000000..f959437
--- /dev/null
+++ b/src/org/openstreetmap/josm/actions/relation/EditLastRelationAction.java
@@ -0,0 +1,109 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.relation;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.JosmAction;
+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.gui.dialogs.relation.RelationEditor;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/**
+ * The action for editing the last relation.
+ */
+public class EditLastRelationAction extends JosmAction implements CommandQueueListener {
+
+    /**
+     * Constructs a new <code>EditLastRelationAction</code>.
+     */
+    public EditLastRelationAction() {
+        super(
+            tr("Open last relation"),
+            "dialogs/edit-last",
+            tr("Call relation editor for last relation"),
+            Shortcut.registerShortcut(
+                "relationeditor:editlastrelation",
+                tr("Relation Editor: {0}", tr("Open last relation")),
+                KeyEvent.CHAR_UNDEFINED,
+                Shortcut.NONE
+                ),
+            false
+        );
+        Main.main.undoRedo.addCommandQueueListener(this);
+    }
+
+    /**
+     * Returns the set of currently selected relation members for the given relation.
+     * @param r The relation to inspect
+     * @return The set of currently selected relation members for the given relation.
+     */
+    public static Set<RelationMember> getMembersForCurrentSelection(Relation r) {
+        Set<RelationMember> members = new HashSet<>();
+        if (Main.isDisplayingMapView()) {
+            OsmDataLayer editLayer = Main.main.getEditLayer();
+            if (editLayer != null && editLayer.data != null) {
+                Collection<OsmPrimitive> selection = editLayer.data.getSelected();
+                for (RelationMember member: r.getMembers()) {
+                    if (selection.contains(member.getMember())) {
+                        members.add(member);
+                    }
+                }
+            }
+        }
+        return members;
+    }
+
+    /**
+     * Launches relation editor for the given relation.
+     * @param toEdit The relation to edit
+     */
+    public static void launchEditor(Relation toEdit) {
+        if (toEdit == null || toEdit.isDeleted() || !Main.isDisplayingMapView()) return;
+        RelationEditor.getEditor(Main.main.getEditLayer(), toEdit,
+                getMembersForCurrentSelection(toEdit)).setVisible(true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        Relation r = getLastRelationOnActiveLayer();
+        if (r == null || !isEnabled()) return;
+        launchEditor(r);
+    }
+
+    @Override
+    public void updateEnabledState() {
+        Relation r = getLastRelationOnActiveLayer();
+        setEnabled(r != null && !r.isDeleted());
+    }
+
+    private Relation getLastRelationOnActiveLayer() {
+        if (Main.map == null || Main.map.mapView == null) return null;
+        Layer activeLayer = Main.map.mapView.getActiveLayer();
+        if (!(activeLayer instanceof OsmDataLayer)) {
+            return null;
+        } else {
+            return ((OsmDataLayer) activeLayer).getLastRelation();
+        }
+    }
+
+    @Override
+    public void commandChanged(int queueSize, int redoSize) {
+        updateEnabledState();
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
index 53cb4da..a9aab41 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
@@ -40,6 +40,7 @@ import org.openstreetmap.josm.actions.relation.DeleteRelationsAction;
 import org.openstreetmap.josm.actions.relation.DownloadMembersAction;
 import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
 import org.openstreetmap.josm.actions.relation.DuplicateRelationAction;
+import org.openstreetmap.josm.actions.relation.EditLastRelationAction;
 import org.openstreetmap.josm.actions.relation.EditRelationAction;
 import org.openstreetmap.josm.actions.relation.SelectMembersAction;
 import org.openstreetmap.josm.actions.relation.SelectRelationAction;
@@ -105,6 +106,7 @@ public class RelationListDialog extends ToggleDialog
     // Actions
     /** the edit action */
     private final EditRelationAction editAction = new EditRelationAction();
+    private final EditLastRelationAction editLastAction = new EditLastRelationAction();
     /** the delete action */
     private final DeleteRelationsAction deleteRelationsAction = new DeleteRelationsAction();
     /** the duplicate action */
@@ -171,6 +173,7 @@ public class RelationListDialog extends ToggleDialog
         createLayout(pane, false, Arrays.asList(new SideButton[]{
                 new SideButton(newAction, false),
                 new SideButton(editAction, false),
+                new SideButton(editLastAction, false),
                 new SideButton(duplicateAction, false),
                 new SideButton(deleteRelationsAction, false),
                 new SideButton(selectRelationAction, false)
@@ -212,6 +215,7 @@ public class RelationListDialog extends ToggleDialog
         MapView.addLayerChangeListener(newAction);
         MapView.addZoomChangeListener(this);
         newAction.updateEnabledState();
+        editLastAction.updateEnabledState();
         DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT);
         DataSet.addSelectionListener(addSelectionToRelations);
         dataChanged(null);
@@ -288,6 +292,10 @@ public class RelationListDialog extends ToggleDialog
         }
     }
 
+    public void updateEnabledStateEditLastAction() {
+        editLastAction.updateEnabledState();
+    }
+
     private JosmTextField  setupFilter() {
         final JosmTextField f = new DisableShortcutsOnFocusGainedTextField();
         f.setToolTipText(tr("Relation list filter"));
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
index 8c04d22..13db6cb 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
@@ -189,4 +189,10 @@ public abstract class RelationEditor extends ExtendedDialog implements RelationA
     public final void removePropertyChangeListener(PropertyChangeListener listener) {
         this.support.removePropertyChangeListener(listener);
     }
+
+    @Override
+    public void dispose() {
+        layer.setLastRelation(relation);
+        super.dispose();
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
index 7a22bdc..a51e83b 100644
--- a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
@@ -121,6 +121,21 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
      */
     public final List<TestError> validationErrors = new ArrayList<>();
 
+    /** last closed relation */
+    private Relation lastRelation;
+
+    /**
+     * Returns the last closed relation or null if none.
+     */
+    public Relation getLastRelation() {
+        return lastRelation;
+    }
+
+    public void setLastRelation(Relation relation) {
+        lastRelation = relation;
+        Main.map.relationListDialog.updateEnabledStateEditLastAction();
+    }
+
     protected void setRequiresSaveToFile(boolean newValue) {
         boolean oldValue = requiresSaveToFile;
         requiresSaveToFile = newValue;
