Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java	(revision 8191)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java	(revision 8193)
@@ -5,5 +5,4 @@
 
 import java.util.Arrays;
-import java.util.HashMap;
 
 import org.openstreetmap.josm.Main;
@@ -20,5 +19,5 @@
  * @since 3715
  */
-public class ImageryHandler extends RequestHandler {
+public class ImageryHandler extends RequestHandler.RawURLParseRequestHandler {
 
     /**
@@ -116,31 +115,4 @@
 
     @Override
-    protected void parseArgs() {
-        HashMap<String, String> args = new HashMap<>();
-        if (request.indexOf('?') != -1) {
-            String query = request.substring(request.indexOf('?') + 1);
-            if (query.indexOf("url=") == 0) {
-                args.put("url", decodeParam(query.substring(4)));
-            } else {
-                int urlIdx = query.indexOf("&url=");
-                if (urlIdx != -1) {
-                    args.put("url", decodeParam(query.substring(urlIdx + 5)));
-                    query = query.substring(0, urlIdx);
-                } else if (query.indexOf('#') != -1) {
-                    query = query.substring(0, query.indexOf('#'));
-                }
-                String[] params = query.split("&", -1);
-                for (String param : params) {
-                    int eq = param.indexOf('=');
-                    if (eq != -1) {
-                        args.put(param.substring(0, eq), decodeParam(param.substring(eq + 1)));
-                    }
-                }
-            }
-        }
-        this.args = args;
-    }
-
-    @Override
     protected void validateRequest() throws RequestHandlerBadRequestException {
         String url = args.get("url");
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java	(revision 8191)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java	(revision 8193)
@@ -7,5 +7,4 @@
 import java.net.URL;
 import java.util.Collection;
-import java.util.HashMap;
 
 import org.openstreetmap.josm.Main;
@@ -18,5 +17,5 @@
  * Handler for import request
  */
-public class ImportHandler extends RequestHandler {
+public class ImportHandler extends RequestHandler.RawURLParseRequestHandler {
 
     /**
@@ -84,33 +83,4 @@
 
     @Override
-    protected void parseArgs() {
-        HashMap<String, String> args = new HashMap<>();
-        if (request.indexOf('?') != -1) {
-            String query = request.substring(request.indexOf('?') + 1);
-            if (query.indexOf("url=") == 0) {
-                args.put("url", decodeParam(query.substring(4)));
-            } else {
-                int urlIdx = query.indexOf("&url=");
-                if (urlIdx != -1) {
-                    args.put("url", decodeParam(query.substring(urlIdx + 5)));
-                    query = query.substring(0, urlIdx);
-                } else {
-                    if (query.indexOf('#') != -1) {
-                        query = query.substring(0, query.indexOf('#'));
-                    }
-                }
-                String[] params = query.split("&", -1);
-                for (String param : params) {
-                    int eq = param.indexOf('=');
-                    if (eq != -1) {
-                        args.put(param.substring(0, eq), param.substring(eq + 1));
-                    }
-                }
-            }
-        }
-        this.args = args;
-    }
-
-    @Override
     protected void validateRequest() throws RequestHandlerBadRequestException {
         String urlString = args.get("url");
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 8191)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandler.java	(revision 8193)
@@ -2,7 +2,13 @@
 package org.openstreetmap.josm.io.remotecontrol.handler;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+import org.openstreetmap.josm.tools.Utils;
+
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
 import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URLDecoder;
 import java.text.MessageFormat;
@@ -14,10 +20,5 @@
 import java.util.Map;
 
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
-import org.openstreetmap.josm.tools.Utils;
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 /**
@@ -193,23 +194,28 @@
     protected void parseArgs() {
         try {
-            String req = URLDecoder.decode(this.request, "UTF-8");
-            HashMap<String, String> args = new HashMap<>();
-            if (req.indexOf('?') != -1) {
-                String query = req.substring(req.indexOf('?') + 1);
-                if (query.indexOf('#') != -1) {
-                            query = query.substring(0, query.indexOf('#'));
-                        }
-                String[] params = query.split("&", -1);
-                for (String param : params) {
-                    int eq = param.indexOf('=');
-                    if (eq != -1) {
-                        args.put(param.substring(0, eq), param.substring(eq + 1));
-                    }
-                }
-            }
-            this.args = args;
-        } catch (UnsupportedEncodingException ex) {
-            throw new IllegalStateException(ex);
-        }
+            this.args = getRequestParameter(new URI(this.request));
+        } catch (URISyntaxException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * @see <a href="http://blog.lunatech.com/2009/02/03/what-every-web-developer-must-know-about-url-encoding">
+     *      What every web developer must know about URL encoding</a>
+     */
+    static Map<String, String> getRequestParameter(URI uri) {
+        Map<String, String> r = new HashMap<>();
+        if (uri.getRawQuery() == null) {
+            return r;
+        }
+        for (String kv : uri.getRawQuery().split("&")) {
+            try {
+                final String[] kvs = URLDecoder.decode(kv, "UTF-8").split("=", 2);
+                r.put(kvs[0], kvs.length > 1 ? kvs[1] : null);
+            } catch (UnsupportedEncodingException ex) {
+                throw new IllegalStateException(ex);
+            }
+        }
+        return r;
     }
 
@@ -269,5 +275,5 @@
     }
 
-    protected final String decodeParam(String param) {
+    protected static String decodeParam(String param) {
         try {
             return URLDecoder.decode(param, "UTF-8");
@@ -319,3 +325,32 @@
         }
     }
+
+    public static abstract class RawURLParseRequestHandler extends RequestHandler {
+        @Override
+        protected void parseArgs() {
+            HashMap<String, String> args = new HashMap<>();
+            if (request.indexOf('?') != -1) {
+                String query = request.substring(request.indexOf('?') + 1);
+                if (query.indexOf("url=") == 0) {
+                    args.put("url", decodeParam(query.substring(4)));
+                } else {
+                    int urlIdx = query.indexOf("&url=");
+                    if (urlIdx != -1) {
+                        args.put("url", decodeParam(query.substring(urlIdx + 5)));
+                        query = query.substring(0, urlIdx);
+                    } else if (query.indexOf('#') != -1) {
+                        query = query.substring(0, query.indexOf('#'));
+                    }
+                    String[] params = query.split("&", -1);
+                    for (String param : params) {
+                        int eq = param.indexOf('=');
+                        if (eq != -1) {
+                            args.put(param.substring(0, eq), decodeParam(param.substring(eq + 1)));
+                        }
+                    }
+                }
+            }
+            this.args = args;
+        }
+    }
 }
