Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java	(revision 8336)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java	(revision 8337)
@@ -4,4 +4,6 @@
 import java.io.File;
 import java.net.InetAddress;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
 import java.net.UnknownHostException;
 
@@ -83,7 +85,39 @@
      * @since 7800
      */
+    @Deprecated
     public static InetAddress getInetAddress() throws UnknownHostException {
         // Return an address to the loopback interface by default
         return InetAddress.getByName(Main.pref.get("remote.control.host", null));
     }
+
+    /**
+     * Returns the IPv6 address used for remote control.
+     * @return the IPv6 address used for remote control
+     * @throws UnknownHostException if the local host name could not be resolved into an address.
+     * @since 8337
+     */
+    public static InetAddress getInet6Address() throws UnknownHostException {
+        for(InetAddress a : InetAddress.getAllByName(Main.pref.get("remote.control.host", "localhost"))) {
+            if(a instanceof Inet6Address) {
+                return a;
+            }
+        };
+        throw new UnknownHostException();
+    }
+
+    /**
+     * Returns the IPv4 address used for remote control.
+     * @return the IPv4 address used for remote control
+     * @throws UnknownHostException if the local host name could not be resolved into an address.
+     * @since 8337
+     */
+    public static InetAddress getInet4Address() throws UnknownHostException {
+        // Return an address to the loopback interface by default
+        for(InetAddress a : InetAddress.getAllByName(Main.pref.get("remote.control.host", "localhost"))) {
+            if(a instanceof Inet4Address) {
+                return a;
+            }
+        };
+        throw new UnknownHostException();
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java	(revision 8336)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java	(revision 8337)
@@ -20,6 +20,8 @@
 public class RemoteControlHttpServer extends Thread {
 
-    /** The server socket */
-    private ServerSocket server;
+    /** The server socket for IPv4 */
+    private ServerSocket server4 = null;
+    /** The server socket for IPv6 */
+    private ServerSocket server6 = null;
 
     private static volatile RemoteControlHttpServer instance;
@@ -66,8 +68,14 @@
         super("RemoteControl HTTP Server");
         this.setDaemon(true);
-        // Start the server socket with only 1 connection.
-        // Also make sure we only listen on the local interface so nobody from the outside can connect!
-        // NOTE: On a dual stack machine with old Windows OS this may not listen on both interfaces!
-        this.server = new ServerSocket(port, 1, RemoteControl.getInetAddress());
+        try {
+            this.server4 = new ServerSocket(port, 1, RemoteControl.getInet4Address());
+        } catch (IOException e) {
+        }
+        try {
+            this.server6 = new ServerSocket(port, 1, RemoteControl.getInet6Address());
+        } catch (IOException e) {
+            if(this.server4 == null) /* both failed */
+                throw e;
+        }
     }
 
@@ -77,16 +85,36 @@
     @Override
     public void run() {
-        Main.info(marktr("RemoteControl::Accepting connections on {0}:{1}"),
-                server.getInetAddress(), Integer.toString(server.getLocalPort()));
+        if(server4 != null) {
+            Main.info(marktr("RemoteControl::Accepting IPv4 connections on {0}:{1}"),
+                server4.getInetAddress(), Integer.toString(server4.getLocalPort()));
+        }
+        if(server6 != null) {
+            Main.info(marktr("RemoteControl::Accepting IPv6 connections on {0}:{1}"),
+                server6.getInetAddress(), Integer.toString(server6.getLocalPort()));
+        }
         while (true) {
-            try {
-                @SuppressWarnings("resource")
-                Socket request = server.accept();
-                RequestProcessor.processRequest(request);
-            } catch (SocketException se) {
-                if (!server.isClosed())
-                    Main.error(se);
-            } catch (IOException ioe) {
-                Main.error(ioe);
+            if(server4 != null) {
+                try {
+                    @SuppressWarnings("resource")
+                    Socket request = server4.accept();
+                    RequestProcessor.processRequest(request);
+                } catch (SocketException se) {
+                    if (!server4.isClosed())
+                        Main.error(se);
+                } catch (IOException ioe) {
+                    Main.error(ioe);
+                }
+            }
+            if(server6 != null) {
+                try {
+                    @SuppressWarnings("resource")
+                    Socket request = server6.accept();
+                    RequestProcessor.processRequest(request);
+                } catch (SocketException se) {
+                    if (!server6.isClosed())
+                        Main.error(se);
+                } catch (IOException ioe) {
+                    Main.error(ioe);
+                }
             }
         }
@@ -99,5 +127,8 @@
      */
     public void stopServer() throws IOException {
-        server.close();
+        if(server4 != null)
+            server4.close();
+        if(server6 != null)
+            server6.close();
         Main.info(marktr("RemoteControl::Server stopped."));
     }
Index: /trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java	(revision 8336)
+++ /trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java	(revision 8337)
@@ -72,6 +72,8 @@
 public class RemoteControlHttpsServer extends Thread {
 
-    /** The server socket */
-    private ServerSocket server;
+    /** The server socket for IPv4 */
+    private ServerSocket server4 = null;
+    /** The server socket for IPv6 */
+    private ServerSocket server6 = null;
 
     private static volatile RemoteControlHttpsServer instance;
@@ -377,17 +379,34 @@
         }
 
-        // Start the server socket with only 1 connection.
-        // Also make sure we only listen on the local interface so nobody from the outside can connect!
-        // NOTE: On a dual stack machine with old Windows OS this may not listen on both interfaces!
-        this.server = factory.createServerSocket(port, 1, RemoteControl.getInetAddress());
-
-        if (Main.isTraceEnabled() && server instanceof SSLServerSocket) {
-            SSLServerSocket sslServer = (SSLServerSocket) server;
-            Main.trace("SSL server - Enabled Cipher suites: "+Arrays.toString(sslServer.getEnabledCipherSuites()));
-            Main.trace("SSL server - Enabled Protocols: "+Arrays.toString(sslServer.getEnabledProtocols()));
-            Main.trace("SSL server - Enable Session Creation: "+sslServer.getEnableSessionCreation());
-            Main.trace("SSL server - Need Client Auth: "+sslServer.getNeedClientAuth());
-            Main.trace("SSL server - Want Client Auth: "+sslServer.getWantClientAuth());
-            Main.trace("SSL server - Use Client Mode: "+sslServer.getUseClientMode());
+        try {
+            this.server4 = factory.createServerSocket(port, 1, RemoteControl.getInet4Address());
+        } catch (IOException e) {
+        }
+        try {
+            this.server6 = factory.createServerSocket(port, 1, RemoteControl.getInet6Address());
+        } catch (IOException e) {
+            if(this.server4 == null) /* both failed */
+                throw e;
+        }
+
+        if (Main.isTraceEnabled()) {
+            if(server4 instanceof SSLServerSocket) {
+                SSLServerSocket sslServer = (SSLServerSocket) server4;
+                Main.trace("SSL server - Enabled Cipher suites: "+Arrays.toString(sslServer.getEnabledCipherSuites()));
+                Main.trace("SSL server - Enabled Protocols: "+Arrays.toString(sslServer.getEnabledProtocols()));
+                Main.trace("SSL server - Enable Session Creation: "+sslServer.getEnableSessionCreation());
+                Main.trace("SSL server - Need Client Auth: "+sslServer.getNeedClientAuth());
+                Main.trace("SSL server - Want Client Auth: "+sslServer.getWantClientAuth());
+                Main.trace("SSL server - Use Client Mode: "+sslServer.getUseClientMode());
+            }
+            if(server6 instanceof SSLServerSocket) {
+                SSLServerSocket sslServer = (SSLServerSocket) server6;
+                Main.trace("SSL server - Enabled Cipher suites: "+Arrays.toString(sslServer.getEnabledCipherSuites()));
+                Main.trace("SSL server - Enabled Protocols: "+Arrays.toString(sslServer.getEnabledProtocols()));
+                Main.trace("SSL server - Enable Session Creation: "+sslServer.getEnableSessionCreation());
+                Main.trace("SSL server - Need Client Auth: "+sslServer.getNeedClientAuth());
+                Main.trace("SSL server - Want Client Auth: "+sslServer.getWantClientAuth());
+                Main.trace("SSL server - Use Client Mode: "+sslServer.getUseClientMode());
+            }
         }
     }
@@ -398,27 +417,58 @@
     @Override
     public void run() {
-        Main.info(marktr("RemoteControl::Accepting secure connections on {0}:{1}"),
-                server.getInetAddress(), Integer.toString(server.getLocalPort()));
+        if(server4 != null) {
+            Main.info(marktr("RemoteControl::Accepting secure IPv4 connections on {0}:{1}"),
+                server4.getInetAddress(), Integer.toString(server4.getLocalPort()));
+        }
+        if(server6 != null) {
+            Main.info(marktr("RemoteControl::Accepting secure IPv6 connections on {0}:{1}"),
+                server6.getInetAddress(), Integer.toString(server6.getLocalPort()));
+        }
         while (true) {
-            try {
-                @SuppressWarnings("resource")
-                Socket request = server.accept();
-                if (Main.isTraceEnabled() && request instanceof SSLSocket) {
-                    SSLSocket sslSocket = (SSLSocket) request;
-                    Main.trace("SSL socket - Enabled Cipher suites: "+Arrays.toString(sslSocket.getEnabledCipherSuites()));
-                    Main.trace("SSL socket - Enabled Protocols: "+Arrays.toString(sslSocket.getEnabledProtocols()));
-                    Main.trace("SSL socket - Enable Session Creation: "+sslSocket.getEnableSessionCreation());
-                    Main.trace("SSL socket - Need Client Auth: "+sslSocket.getNeedClientAuth());
-                    Main.trace("SSL socket - Want Client Auth: "+sslSocket.getWantClientAuth());
-                    Main.trace("SSL socket - Use Client Mode: "+sslSocket.getUseClientMode());
-                    Main.trace("SSL socket - Session: "+sslSocket.getSession());
-                }
-                RequestProcessor.processRequest(request);
-            } catch (SocketException se) {
-                if (!server.isClosed()) {
-                    Main.error(se);
-                }
-            } catch (IOException ioe) {
-                Main.error(ioe);
+            if(server4 != null) {
+                try {
+                    @SuppressWarnings("resource")
+                    Socket request = server4.accept();
+                    if (Main.isTraceEnabled() && request instanceof SSLSocket) {
+                        SSLSocket sslSocket = (SSLSocket) request;
+                        Main.trace("SSL socket - Enabled Cipher suites: "+Arrays.toString(sslSocket.getEnabledCipherSuites()));
+                        Main.trace("SSL socket - Enabled Protocols: "+Arrays.toString(sslSocket.getEnabledProtocols()));
+                        Main.trace("SSL socket - Enable Session Creation: "+sslSocket.getEnableSessionCreation());
+                        Main.trace("SSL socket - Need Client Auth: "+sslSocket.getNeedClientAuth());
+                        Main.trace("SSL socket - Want Client Auth: "+sslSocket.getWantClientAuth());
+                        Main.trace("SSL socket - Use Client Mode: "+sslSocket.getUseClientMode());
+                        Main.trace("SSL socket - Session: "+sslSocket.getSession());
+                    }
+                    RequestProcessor.processRequest(request);
+                } catch (SocketException se) {
+                    if (!server4.isClosed()) {
+                        Main.error(se);
+                    }
+                } catch (IOException ioe) {
+                    Main.error(ioe);
+                }
+            }
+            if(server6 != null) {
+                try {
+                    @SuppressWarnings("resource")
+                    Socket request = server6.accept();
+                    if (Main.isTraceEnabled() && request instanceof SSLSocket) {
+                        SSLSocket sslSocket = (SSLSocket) request;
+                        Main.trace("SSL socket - Enabled Cipher suites: "+Arrays.toString(sslSocket.getEnabledCipherSuites()));
+                        Main.trace("SSL socket - Enabled Protocols: "+Arrays.toString(sslSocket.getEnabledProtocols()));
+                        Main.trace("SSL socket - Enable Session Creation: "+sslSocket.getEnableSessionCreation());
+                        Main.trace("SSL socket - Need Client Auth: "+sslSocket.getNeedClientAuth());
+                        Main.trace("SSL socket - Want Client Auth: "+sslSocket.getWantClientAuth());
+                        Main.trace("SSL socket - Use Client Mode: "+sslSocket.getUseClientMode());
+                        Main.trace("SSL socket - Session: "+sslSocket.getSession());
+                    }
+                    RequestProcessor.processRequest(request);
+                } catch (SocketException se) {
+                    if (!server6.isClosed()) {
+                        Main.error(se);
+                    }
+                } catch (IOException ioe) {
+                    Main.error(ioe);
+                }
             }
         }
@@ -431,8 +481,10 @@
      */
     public void stopServer() throws IOException {
-        if (server != null) {
-            server.close();
-            Main.info(marktr("RemoteControl::Server (https) stopped."));
-        }
+        if(server4 != null)
+            server4.close();
+        if(server6 != null)
+            server6.close();
+        if(server6 != null || server4 != null)
+        Main.info(marktr("RemoteControl::Server (IPv6 https) stopped."));
     }
 }
