Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java	(revision 15499)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java	(revision 15500)
@@ -4,6 +4,8 @@
 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;
@@ -17,4 +19,5 @@
  */
 public class PermissionPrefWithDefault {
+    private static final List<PermissionPrefWithDefault> PREFS = new ArrayList<>();
 
     public static final PermissionPrefWithDefault LOAD_DATA =
@@ -47,4 +50,11 @@
     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;
@@ -53,13 +63,45 @@
     }
 
+    /**
+     * Determines if the action is allowed.
+     * @return true if the action is allowed
+     */
     public boolean isAllowed() {
         return Config.getPref().getBoolean(pref, defaultVal);
     }
 
+    /**
+     * Returns a non-modifiable list of permission preferences for Remote Control.
+     * @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);
+    }
+
+    /**
+     * Adds a permission preference.
+     * @param pref The preference to add to the list returned by
+     *             {@link PermissionPrefWithDefault#getPermissionPrefs}
+     * @since 15500
+     */
+    public static void addPermissionPref(PermissionPrefWithDefault pref) {
+        if (pref.pref != null && PREFS.parallelStream().noneMatch(tPref -> pref.pref.equals(tPref.pref)))
+            PREFS.add(pref);
+    }
+
+    /**
+     * Removes a permission preference.
+     * @param pref The preference to remove from the list returned by
+     *             {@link PermissionPrefWithDefault#getPermissionPrefs}
+     *
+     * @return see {@link List#removeAll}
+     * @since 15500
+     */
+    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: trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 15499)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 15500)
@@ -20,4 +20,5 @@
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
@@ -127,19 +128,29 @@
             }
             handlers.put(commandWithSlash, handler);
-        }
-    }
-
-    /** Add default request handlers */
+            try {
+                Optional.ofNullable(handler.getConstructor().newInstance().getPermissionPref())
+                        .ifPresent(PermissionPrefWithDefault::addPermissionPref);
+            } catch (ReflectiveOperationException | RuntimeException e) {
+                Logging.debug(e);
+            }
+        }
+    }
+
+    /**
+     * 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);
     }
