Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 4833)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 4834)
@@ -11,7 +11,12 @@
 import java.io.Writer;
 import java.net.Socket;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.StringTokenizer;
+import java.util.TreeMap;
+import java.util.TreeSet;
 
 import org.openstreetmap.josm.io.remotecontrol.handler.AddNodeHandler;
@@ -26,4 +31,5 @@
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerForbiddenException;
 import org.openstreetmap.josm.io.remotecontrol.handler.VersionHandler;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -49,5 +55,5 @@
      * can extend this list by using @see addRequestHandler
      */
-    private static HashMap<String, Class<? extends RequestHandler>> handlers = new HashMap<String, Class<? extends RequestHandler>>();
+    private static Map<String, Class<? extends RequestHandler>> handlers = new TreeMap<String, Class<? extends RequestHandler>>();
 
     /**
@@ -174,9 +180,21 @@
 
             // find a handler for this command
-            Class<? extends RequestHandler> handlerClass = handlers
-                    .get(command);
+            Class<? extends RequestHandler> handlerClass = handlers.get(command);
             if (handlerClass == null) {
                 // no handler found
-                sendBadRequest(out);
+                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 help = "No command specified! The following commands are available:<ul>"
+                        + usage.toString()
+                        + "</ul>";
+                sendBadRequest(out, help);
             } else {
                 // create handler object
@@ -196,5 +214,5 @@
                     sendError(out);
                 } catch (RequestHandlerBadRequestException ex) {
-                    sendBadRequest(out);
+                    sendBadRequest(out, ex.getMessage());
                 } catch (RequestHandlerForbiddenException ex) {
                     sendForbidden(out);
@@ -282,5 +300,5 @@
      *             If the error can not be written
      */
-    private void sendBadRequest(Writer out) throws IOException {
+    private void sendBadRequest(Writer out, String help) throws IOException {
         sendHeader(out, "400 Bad Request", "text/html", true);
         out.write("<HTML>\r\n");
@@ -289,4 +307,7 @@
         out.write("<BODY>");
         out.write("<H1>HTTP Error 400: Bad Request</h2>\r\n");
+        if (help != null) {
+            out.write(help);
+        }
         out.write("</BODY></HTML>\r\n");
         out.flush();
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java	(revision 4833)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java	(revision 4834)
@@ -27,5 +27,5 @@
 
     @Override
-    protected String[] getMandatoryParams()
+    public String[] getMandatoryParams()
     {
         return new String[] { "lat", "lon" };
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 4833)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java	(revision 4834)
@@ -22,5 +22,5 @@
 
     @Override
-    protected String[] getMandatoryParams() {
+    public String[] getMandatoryParams() {
         return new String[]{"way"};
     }
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java	(revision 4833)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java	(revision 4834)
@@ -26,5 +26,5 @@
 
     @Override
-    protected String[] getMandatoryParams()
+    public String[] getMandatoryParams()
     {
         return new String[] { "url" };
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java	(revision 4833)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java	(revision 4834)
@@ -32,5 +32,5 @@
 
     @Override
-    protected String[] getMandatoryParams()
+    public String[] getMandatoryParams()
     {
         return new String[] { "url" };
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 4833)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 4834)
@@ -50,5 +50,5 @@
 
     @Override
-    protected String[] getMandatoryParams()
+    public String[] getMandatoryParams()
     {
         return new String[] { "bottom", "top", "left", "right" };
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java	(revision 4833)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java	(revision 4834)
@@ -20,5 +20,5 @@
 
     @Override
-    protected String[] getMandatoryParams() {
+    public String[] getMandatoryParams() {
         return new String[]{"objects"};
     }
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 4833)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 4834)
@@ -5,4 +5,6 @@
 
 import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.StringTokenizer;
 
@@ -11,4 +13,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -91,6 +94,5 @@
     }
 
-    protected String[] getMandatoryParams()
-    {
+    public String[] getMandatoryParams() {
         return null;
     }
@@ -169,4 +171,5 @@
         if(mandatory == null) return;
 
+        List<String> missingKeys = new LinkedList<String>();
         boolean error = false;
         for (int i = 0; i < mandatory.length; ++i) {
@@ -176,8 +179,12 @@
                 error = true;
                 System.out.println("'" + myCommand + "' remote control request must have '" + key + "' parameter");
+                missingKeys.add(key);
             }
         }
-        if (error)
-            throw new RequestHandlerBadRequestException();
+        if (error) {
+            throw new RequestHandlerBadRequestException(
+                    "The following keys are mandatory, but have not been provided: "
+                    + Utils.join(", ", missingKeys));
+        }
     }
 
@@ -204,4 +211,11 @@
 
     public static class RequestHandlerException extends Exception {
+
+        public RequestHandlerException(String message) {
+            super(message);
+        }
+
+        public RequestHandlerException() {
+        }
     }
 
@@ -210,4 +224,8 @@
 
     public static class RequestHandlerBadRequestException extends RequestHandlerException {
+
+        public RequestHandlerBadRequestException(String message) {
+            super(message);
+        }
     }
     
