Index: src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java	(revision 15491)
+++ src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java	(working copy)
@@ -3,8 +3,10 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.spi.preferences.Config;
 
@@ -16,6 +18,7 @@
  * @author Bodo Meissner
  */
 public class PermissionPrefWithDefault {
+    private static final List<PermissionPrefWithDefault> PREFS = new ArrayList<>();
 
     public static final PermissionPrefWithDefault LOAD_DATA =
             new PermissionPrefWithDefault("remotecontrol.permission.load-data", true, tr("Load data from API"));
@@ -46,6 +49,13 @@
      */
     public final String preferenceText;
 
+    /**
+     * Create a new {@code PermissionPrefWithDefault}
+     *
+     * @param pref           The preference key for the permission
+     * @param defaultVal     The default value of the preference
+     * @param preferenceText The text to show in UI objects
+     */
     public PermissionPrefWithDefault(String pref, boolean defaultVal, String preferenceText) {
         this.pref = pref;
         this.defaultVal = defaultVal;
@@ -52,14 +62,40 @@
         this.preferenceText = preferenceText;
     }
 
+    /**
+     * @return true if the action is allowed
+     */
     public boolean isAllowed() {
         return Config.getPref().getBoolean(pref, defaultVal);
     }
 
+    /**
+     * @return A non-modifiable list of permission preferences for Remote Control
+     */
     public static List<PermissionPrefWithDefault> getPermissionPrefs() {
-        return Arrays.asList(
-                LOAD_DATA, IMPORT_DATA, OPEN_FILES, LOAD_IMAGERY,
-                CHANGE_SELECTION, CHANGE_VIEWPORT,
-                CREATE_OBJECTS, READ_PROTOCOL_VERSION);
+        return Collections.unmodifiableList(PREFS);
     }
+
+    /**
+     * @param pref The preference to add to the list returned by
+     *             {@link PermissionPrefWithDefault#getPermissionPrefs}
+     */
+    public static void addPermissionPref(PermissionPrefWithDefault pref) {
+        if (pref.pref != null && PREFS.parallelStream().noneMatch(tPref -> pref.pref.equals(tPref.pref)))
+            PREFS.add(pref);
+    }
+
+    /**
+     * @param pref The preference to remove from the list returned by
+     *             {@link PermissionPrefWithDefault#getPermissionPrefs}
+     *
+     * @return see {@link List#removeAll}
+     */
+    public static boolean removePermissionPref(PermissionPrefWithDefault pref) {
+        List<PermissionPrefWithDefault> toRemove = Collections.emptyList();
+        if (pref.pref != null)
+            toRemove = PREFS.parallelStream().filter(tPref -> pref.pref.equals(tPref.pref))
+                    .collect(Collectors.toList());
+        return PREFS.removeAll(toRemove);
+    }
 }
Index: src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 15491)
+++ src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(working copy)
@@ -10,6 +10,7 @@
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.lang.reflect.InvocationTargetException;
 import java.net.Socket;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
@@ -126,21 +127,33 @@
                     command + "\" (handled by " + handler.getSimpleName() + ')');
             }
             handlers.put(commandWithSlash, handler);
+            try {
+                PermissionPrefWithDefault pref = handler.getConstructor().newInstance().getPermissionPref();
+                if (pref != null)
+                    PermissionPrefWithDefault.addPermissionPref(pref);
+            } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+                    | InvocationTargetException | NoSuchMethodException | SecurityException e) {
+                Logging.debug(e);
+            }
         }
     }
 
-    /** Add default request handlers */
+    /**
+     * Add default request handlers and permission preferences (order is important)
+     */
     static {
         addRequestHandlerClass(LoadAndZoomHandler.command, LoadAndZoomHandler.class, true);
         addRequestHandlerClass(LoadAndZoomHandler.command2, LoadAndZoomHandler.class, true);
+        addRequestHandlerClass(LoadObjectHandler.command, LoadObjectHandler.class, true);
         addRequestHandlerClass(LoadDataHandler.command, LoadDataHandler.class, true);
+        addRequestHandlerClass(ImportHandler.command, ImportHandler.class, true);
+        addRequestHandlerClass(OpenFileHandler.command, OpenFileHandler.class, true);
         addRequestHandlerClass(ImageryHandler.command, ImageryHandler.class, true);
+        PermissionPrefWithDefault.addPermissionPref(PermissionPrefWithDefault.CHANGE_SELECTION);
+        PermissionPrefWithDefault.addPermissionPref(PermissionPrefWithDefault.CHANGE_VIEWPORT);
         addRequestHandlerClass(AddNodeHandler.command, AddNodeHandler.class, true);
         addRequestHandlerClass(AddWayHandler.command, AddWayHandler.class, true);
-        addRequestHandlerClass(ImportHandler.command, ImportHandler.class, true);
         addRequestHandlerClass(VersionHandler.command, VersionHandler.class, true);
-        addRequestHandlerClass(LoadObjectHandler.command, LoadObjectHandler.class, true);
-        addRequestHandlerClass(OpenFileHandler.command, OpenFileHandler.class, true);
         addRequestHandlerClass(FeaturesHandler.command, FeaturesHandler.class, true);
     }
 
