diff --git a/src/org/openstreetmap/josm/data/UndoRedoHandler.java b/src/org/openstreetmap/josm/data/UndoRedoHandler.java
index 0602ecea0..29541aadd 100644
--- a/src/org/openstreetmap/josm/data/UndoRedoHandler.java
+++ b/src/org/openstreetmap/josm/data/UndoRedoHandler.java
@@ -393,6 +393,21 @@ public synchronized void undo(int num) {
         });
     }
 
+    /**
+     * Undoes the specified command.
+     * @param command the command to undo
+     * @throws NullPointerException if the command is null
+     * @since xxx
+     */
+    public synchronized void undo(Command command) {
+        Objects.requireNonNull(command, "command");
+        if (commands.remove(command)) {
+            command.undoCommand();
+            redoCommands.add(command);
+            fireCommandsChanged();
+        }
+    }
+
     /**
      * Redoes the last undoed command.
      */
diff --git a/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java b/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
index 554aba099..d998586ec 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
@@ -86,6 +86,7 @@
     private UndoRedoType lastOperation = UndoRedoType.UNDO;
 
     // Actions for context menu and Enter key
+    private final UndoCommandAction undoCommandAction = new UndoCommandAction();
     private final SelectAction selectAction = new SelectAction();
     private final SelectAndZoomAction selectAndZoomAction = new SelectAndZoomAction();
 
@@ -347,7 +348,7 @@ protected CommandListMutableTreeNode getNodeForCommand(PseudoCommand c) {
     /**
      * Return primitives that are affected by some command
      * @param path GUI elements
-     * @return collection of affected primitives, onluy usable ones
+     * @return collection of affected primitives, only usable ones
      */
     protected static Collection<? extends OsmPrimitive> getAffectedPrimitives(TreePath path) {
         PseudoCommand c = ((CommandListMutableTreeNode) path.getLastPathComponent()).getCommand();
@@ -408,6 +409,38 @@ private void swapNode(DefaultTreeModel srcModel, DefaultMutableTreeNode srcRoot,
         ensureTreesConsistency();
     }
 
+    /**
+     * Action that undoes the single selected command, but not the commands that followed after.
+     * @since xxx
+     */
+    public class UndoCommandAction extends AbstractAction {
+
+        /**
+         * Constructs a new {@code UndoCommandAction}.
+         */
+        public UndoCommandAction() {
+            putValue(NAME, tr("Undo this action"));
+            putValue(SHORT_DESCRIPTION, tr("Undo this action"));
+            new ImageProvider("undo").getResource().attachImageIcon(this, true);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (!undoTree.isSelectionEmpty()) {
+                undoSelected();
+            }
+        }
+
+        private void undoSelected() {
+            final TreePath path = undoTree.getSelectionPath();
+            final PseudoCommand command = ((CommandListMutableTreeNode) path.getLastPathComponent()).getCommand();
+            if (command instanceof Command) {
+                UndoRedoHandler.getInstance().undo((Command) command);
+                buildTrees();
+            }
+        }
+    }
+
     /**
      * Action that selects the objects that take part in a command.
      */
@@ -546,6 +579,7 @@ public void mouseClicked(MouseEvent evt) {
 
     private class CommandStackPopup extends JPopupMenu {
         CommandStackPopup() {
+            add(undoCommandAction);
             add(selectAction);
             add(selectAndZoomAction);
         }
