Index: src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(working copy)
@@ -294,7 +294,7 @@
     public static void addTags(final Map<String, String> args, final String sender) {
         if (args.containsKey("addtags")) {
             GuiHelper.executeByMainWorkerInEDT(new Runnable() {
-
+                @Override
                 public void run() {
                     String[] tags = null;
                     try {
Index: src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(working copy)
@@ -7,6 +7,8 @@
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.io.Writer;
 import java.net.Socket;
 import java.util.Arrays;
@@ -21,6 +23,7 @@
 
 import org.openstreetmap.josm.io.remotecontrol.handler.AddNodeHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.AddWayHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.FeaturesHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.ImageryHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.ImportHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.LoadAndZoomHandler;
@@ -126,11 +129,13 @@
         addRequestHandlerClass(VersionHandler.command, VersionHandler.class, true);
         addRequestHandlerClass(LoadObjectHandler.command, LoadObjectHandler.class, true);
         addRequestHandlerClass(OpenFileHandler.command, OpenFileHandler.class, true);
+        addRequestHandlerClass(FeaturesHandler.command, FeaturesHandler.class, true);
     }
 
     /**
      * The work is done here.
      */
+    @Override
     public void run() {
         Writer out = null;
         try {
@@ -202,17 +207,7 @@
             // find a handler for this command
             Class<? extends RequestHandler> handlerClass = handlers.get(command);
             if (handlerClass == null) {
-                // no handler found
-                StringBuilder usage = new StringBuilder(1024);
-                for (Entry<String, Class<? extends RequestHandler>> handler : handlers.entrySet()) {
-                    String[] mandatory = handler.getValue().newInstance().getMandatoryParams();
-                    usage.append("<li>");
-                    usage.append(handler.getKey());
-                    if (mandatory != null) {
-                        usage.append("<br/>mandatory parameter: ").append(Utils.join(", ", Arrays.asList(mandatory)));
-                    }
-                    usage.append("</li>");
-                }
+                String usage = getUsageAsHtml();
                 String websiteDoc = "http://josm.openstreetmap.de/wiki/Help/Preferences/RemoteControl";
                 String help = "No command specified! The following commands are available:<ul>"
                         + usage.toString()
@@ -363,4 +358,81 @@
         if (endHeaders)
             out.write("\r\n");
     }
+
+    public static String getHandlersInfoAsJSON() {
+        StringWriter w = new StringWriter(500);
+        PrintWriter r = new PrintWriter(w);
+        boolean first = true;
+        r.append('[');
+
+        for (Entry<String, Class<? extends RequestHandler>> p : handlers.entrySet()) {
+            if (first) {
+                first = false;
+            } else {
+                r.append(", ");
+            }
+            r.append('{');
+            RequestHandler handler = null;
+            try {
+                handler = p.getValue().newInstance();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+
+            r.printf("\"request\" : \"%s\"", p.getKey());
+            r.append(", \"parameters\" : [");
+
+            String params[] = handler.getMandatoryParams();
+            if (params != null) {
+                for (int i = 0; i < params.length; i++) {
+                    if (i == 0) {
+                        r.append('\"');
+                    } else {
+                        r.append(", \"");
+                    }
+                    r.append(params[i]).append('\"');
+                }
+            }
+            r.append("], \"optional\" : [");
+            String optional[] = handler.getOptionalParams();
+            if (optional != null) {
+                for (int i = 0; i < optional.length; i++) {
+                    if (i == 0) {
+                        r.append('\"');
+                    } else {
+                        r.append(", \"");
+                    }
+                    r.append(optional[i]).append('\"');
+                }
+            }
+            r.append("]}");
+        }
+        
+        try {
+            w.close();
+        } catch (IOException ex) {
+            ex.printStackTrace();
+        }
+        return w.toString();
+    }
+
+    public String getUsageAsHtml() throws IllegalAccessException, InstantiationException {
+        // no handler found
+        StringBuilder usage = new StringBuilder(1024);
+        for (Entry<String, Class<? extends RequestHandler>> handler : handlers.entrySet()) {
+            RequestHandler sample = handler.getValue().newInstance();
+            String[] mandatory = sample.getMandatoryParams();
+            String[] optional = sample.getOptionalParams();
+            usage.append("<li>");
+            usage.append(handler.getKey());
+            if (mandatory != null) {
+                usage.append("<br/>mandatory parameters: ").append(Utils.join(", ", Arrays.asList(mandatory)));
+            }
+            if (optional != null) {
+                usage.append("<br/>optional parameters: ").append(Utils.join(", ", Arrays.asList(optional)));
+            }
+            usage.append("</li>");
+        }
+        return usage.toString();
+    }
 }
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java	(working copy)
@@ -43,6 +43,12 @@
     {
         return new String[] { "lat", "lon" };
     }
+    
+    @Override
+    public String[] getOptionalParams()
+    {
+        return new String[] { "addtags" };
+    }
 
     @Override
     public String getPermissionMessage() {
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(working copy)
@@ -45,6 +45,12 @@
     public String[] getMandatoryParams() {
         return new String[]{"way"};
     }
+    
+    @Override
+    public String[] getOptionalParams()
+    {
+        return new String[] { "addtags" };
+    }
 
     @Override
     protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException {
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/FeaturesHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/FeaturesHandler.java	(working copy)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/FeaturesHandler.java	(working copy)
@@ -7,20 +7,23 @@
 import org.openstreetmap.josm.io.remotecontrol.RequestProcessor;
 
 /**
- * Handler for version request.
+ * Handler for features request.
  */
-public class VersionHandler extends RequestHandler {
+public class FeaturesHandler extends RequestHandler {
 
     /**
-     * The remote control command name used to reply version.
+     * The remote control command name used to reply features.
      */
-    public static final String command = "version";
+    public static final String command = "features";
 
     @Override
     protected void handleRequest() throws RequestHandlerErrorException,
             RequestHandlerBadRequestException {
-        content = RequestProcessor.PROTOCOLVERSION;
-        contentType = "application/json";
+        //contentType = "application/json";
+        contentType = "text/plain";
+        
+        content = RequestProcessor.getHandlersInfoAsJSON();
+        
         if (args.containsKey("jsonp")) {
             content = args.get("jsonp") + " && " + args.get("jsonp") + "(" + content + ")";
         }
@@ -28,7 +31,7 @@
 
     @Override
     public String getPermissionMessage() {
-        return tr("Remote Control has been asked to report its protocol version. This enables web sites to detect a running JOSM.");
+        return tr("Remote Control has been asked 'features' request. This enables web sites to detect capabilitites of remote control.");
     }
 
     @Override
@@ -40,6 +43,12 @@
     public String[] getMandatoryParams() {
         return null;
     }
+    
+    @Override
+    public String[] getOptionalParams()
+    {
+        return new String[] {"jsonp"};
+    }
 
     @Override
     protected void validateRequest() throws RequestHandlerBadRequestException {
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java	(working copy)
@@ -32,6 +32,12 @@
     public String[] getMandatoryParams() {
         return new String[]{"url"};
     }
+    
+    @Override
+    public String[] getOptionalParams()
+    {
+        return new String[] { "title", "type", "cookies", "min_zoom", "max_zoom"};
+    }
 
     @Override
     public PermissionPrefWithDefault getPermissionPref() {
@@ -99,7 +105,7 @@
         }
         this.args = args;
     }
-
+    
     @Override
     protected void validateRequest() throws RequestHandlerBadRequestException {
         // Nothing to do
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java	(working copy)
@@ -44,6 +44,12 @@
     public String[] getMandatoryParams() {
         return new String[]{"url"};
     }
+    
+    @Override
+    public String[] getOptionalParams()
+    {
+        return new String[] {"new_layer"};
+    }
 
     @Override
     public String getPermissionMessage() {
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(working copy)
@@ -72,6 +72,12 @@
     }
 
     @Override
+    public String[] getOptionalParams()
+    {
+        return new String[] {"new_layer", "addtags", "select", "zoom_mode"};
+    }
+
+    @Override
     protected void handleRequest() throws RequestHandlerErrorException
     {
         DownloadTask osmTask = new DownloadOsmTask();
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java	(working copy)
@@ -32,8 +32,14 @@
     public String[] getMandatoryParams() {
         return new String[]{"objects"};
     }
-
+    
     @Override
+    public String[] getOptionalParams()
+    {
+        return new String[] {"new_layer", "addtags", "select", "zoom_mode"};
+    }
+    
+    @Override
     protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException {
         if (!PermissionPrefWithDefault.LOAD_DATA.isAllowed()) {
             System.out.println("RemoteControl: download forbidden by preferences");
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/OpenFileHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/OpenFileHandler.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/OpenFileHandler.java	(working copy)
@@ -24,6 +24,11 @@
     public String[] getMandatoryParams() {
         return new String[]{"filename"};
     }
+    
+    @Override
+    public String[] getOptionalParams() {
+        return null;
+    }
 
     @Override
     public PermissionPrefWithDefault getPermissionPref() {
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(working copy)
@@ -105,6 +105,10 @@
     abstract public PermissionPrefWithDefault getPermissionPref();
 
     abstract public String[] getMandatoryParams();
+    
+     public String[] getOptionalParams() {
+         return null;
+     }
 
     /**
      * Check permissions in preferences and display error message
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java	(revision 6046)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java	(working copy)
@@ -40,6 +40,11 @@
     public String[] getMandatoryParams() {
         return null;
     }
+    
+    @Override
+    public String[] getOptionalParams() {
+        return new String[]{"jsonp"};
+    }
 
     @Override
     protected void validateRequest() throws RequestHandlerBadRequestException {
