Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 13236)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 13241)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
+import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -35,4 +36,7 @@
     public static final String loadInNewLayerKey = "remotecontrol.new-layer";
     public static final boolean loadInNewLayerDefault = false;
+
+    /** past confirmations */
+    protected static PermissionCache PERMISSIONS = new PermissionCache();
 
     /** The GET request arguments */
@@ -153,4 +157,12 @@
             Logging.info(err);
             throw new RequestHandlerForbiddenException(err);
+        }
+
+        /*
+         * Did the user confirm this action previously?
+         * If yes, skip the global confirmation dialog.
+         */
+        if (PERMISSIONS.isAllowed(myCommand, sender)) {
+            return;
         }
 
@@ -167,9 +179,12 @@
                 label.setText(message.replaceFirst("<div>", "<div style=\"width:" + maxWidth + "px;\">"));
             }
-            if (JOptionPane.showConfirmDialog(Main.parent, label,
-                tr("Confirm Remote Control action"),
-                JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) {
-                    String err = MessageFormat.format("RemoteControl: ''{0}'' forbidden by user''s choice", myCommand);
-                    throw new RequestHandlerForbiddenException(err);
+            Object[] choices = new Object[] {tr("Yes, always"), tr("Yes, once"), tr("No")};
+            int choice = JOptionPane.showOptionDialog(Main.parent, label, tr("Confirm Remote Control action"),
+                    JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, choices, choices[1]);
+            if (choice != JOptionPane.YES_OPTION && choice != JOptionPane.NO_OPTION) { // Yes/no refer to always/once
+                String err = MessageFormat.format("RemoteControl: ''{0}'' forbidden by user''s choice", myCommand);
+                throw new RequestHandlerForbiddenException(err);
+            } else if (choice == JOptionPane.YES_OPTION) {
+                PERMISSIONS.allow(myCommand, sender);
             }
         }
@@ -391,3 +406,19 @@
         }
     }
+
+    static class PermissionCache {
+        private final Set<Pair<String, String>> allowed = new HashSet<>();
+
+        public void allow(String command, String sender) {
+            allowed.add(Pair.create(command, sender));
+        }
+
+        public boolean isAllowed(String command, String sender) {
+            return allowed.contains(Pair.create(command, sender));
+        }
+
+        public void clear() {
+            allowed.clear();
+        }
+    }
 }
