Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 8338)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 8339)
@@ -1695,4 +1695,5 @@
 
         String[] obsolete = {
+                "remote.control.host", // replaced by individual values for IPv4 and IPv6. To remove end of 2015
                 "osm.notes.enableDownload", // was used prior to r8071 when notes was an hidden feature. To remove end of 2015
                 "mappaint.style.migration.switchedToMapCSS", // was used prior to 8315 for MapCSS switch. To remove end of 2015
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java	(revision 8338)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java	(revision 8339)
@@ -80,16 +80,4 @@
 
     /**
-     * Returns the inet address used for remote control.
-     * @return the inet address used for remote control
-     * @throws UnknownHostException if the local host name could not be resolved into an address.
-     * @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
@@ -98,5 +86,5 @@
      */
     public static InetAddress getInet6Address() throws UnknownHostException {
-        for(InetAddress a : InetAddress.getAllByName(Main.pref.get("remote.control.host", "localhost"))) {
+        for(InetAddress a : InetAddress.getAllByName(Main.pref.get("remote.control.host.ipv6", "::1"))) {
             if(a instanceof Inet6Address) {
                 return a;
@@ -114,5 +102,5 @@
     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"))) {
+        for(InetAddress a : InetAddress.getAllByName(Main.pref.get("remote.control.host.ipv4", "127.0.0.1"))) {
             if(a instanceof Inet4Address) {
                 return a;
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java	(revision 8338)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java	(revision 8339)
@@ -20,10 +20,11 @@
 public class RemoteControlHttpServer extends Thread {
 
-    /** The server socket for IPv4 */
-    private ServerSocket server4 = null;
-    /** The server socket for IPv6 */
-    private ServerSocket server6 = null;
+    /** The server socket */
+    private ServerSocket server = null;
 
-    private static volatile RemoteControlHttpServer instance;
+    /** The server instance for IPv4 */
+    private static volatile RemoteControlHttpServer instance4 = null;
+    /** The server instance for IPv6 */
+    private static volatile RemoteControlHttpServer instance6 = null;
 
     /**
@@ -31,15 +32,22 @@
      */
     public static void restartRemoteControlHttpServer() {
+        stopRemoteControlHttpServer();
         int port = Main.pref.getInteger("remote.control.port", 8111);
         try {
-            stopRemoteControlHttpServer();
-
-            instance = new RemoteControlHttpServer(port);
-            instance.start();
-        } catch (BindException ex) {
-            Main.warn(marktr("Cannot start remotecontrol server on port {0}: {1}"),
+            instance4 = new RemoteControlHttpServer(port, false);
+            instance4.start();
+        } catch (Exception ex) {
+            Main.warn(marktr("Cannot start IPv4 remotecontrol server on port {0}: {1}"),
                     Integer.toString(port), ex.getLocalizedMessage());
-        } catch (IOException ioe) {
-            Main.error(ioe);
+        }
+        try {
+            instance6 = new RemoteControlHttpServer(port, true);
+            instance6.start();
+        } catch (Exception ex) {
+            /* only show error when we also have no IPv4 */
+            if(instance4 == null) {
+                Main.warn(marktr("Cannot start IPv6 remotecontrol server on port {0}: {1}"),
+                    Integer.toString(port), ex.getLocalizedMessage());
+            }
         }
     }
@@ -50,8 +58,16 @@
      */
     public static void stopRemoteControlHttpServer() {
-        if (instance != null) {
+        if (instance4 != null) {
             try {
-                instance.stopServer();
-                instance = null;
+                instance4.stopServer();
+                instance4 = null;
+            } catch (IOException ioe) {
+                Main.error(ioe);
+            }
+        }
+        if (instance6 != null) {
+            try {
+                instance6.stopServer();
+                instance6 = null;
             } catch (IOException ioe) {
                 Main.error(ioe);
@@ -63,19 +79,13 @@
      * Constructor
      * @param port The port this server will listen on
+     * @param ipv6 Whether IPv6 or IPv4 server should be started
      * @throws IOException when connection errors
+     * @since 8339
      */
-    public RemoteControlHttpServer(int port) throws IOException {
+    public RemoteControlHttpServer(int port, boolean ipv6) throws IOException {
         super("RemoteControl HTTP Server");
         this.setDaemon(true);
-        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;
-        }
+        this.server = new ServerSocket(port, 1, ipv6 ?
+            RemoteControl.getInet6Address() : RemoteControl.getInet4Address());
     }
 
@@ -85,36 +95,16 @@
     @Override
     public void run() {
-        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()));
-        }
+        Main.info(marktr("RemoteControl::Accepting remote connections on {0}:{1}"),
+                server.getInetAddress(), Integer.toString(server.getLocalPort()));
         while (true) {
-            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);
-                }
+            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);
             }
         }
@@ -127,9 +117,7 @@
      */
     public void stopServer() throws IOException {
-        if(server4 != null)
-            server4.close();
-        if(server6 != null)
-            server6.close();
-        Main.info(marktr("RemoteControl::Server stopped."));
+        Main.info(marktr("RemoteControl::Server {0}:{1} stopped."),
+        server.getInetAddress(), Integer.toString(server.getLocalPort()));
+        server.close();
     }
 }
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java	(revision 8338)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java	(revision 8339)
@@ -3,5 +3,4 @@
 
 import static org.openstreetmap.josm.tools.I18n.marktr;
-import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.IOException;
@@ -72,13 +71,16 @@
 public class RemoteControlHttpsServer extends Thread {
 
-    /** The server socket for IPv4 */
-    private ServerSocket server4 = null;
-    /** The server socket for IPv6 */
-    private ServerSocket server6 = null;
-
-    private static volatile RemoteControlHttpsServer instance;
-    private boolean initOK = false;
+    /** The server socket */
+    private ServerSocket server = null;
+
+    /** The server instance for IPv4 */
+    private static volatile RemoteControlHttpsServer instance4 = null;
+    /** The server instance for IPv6 */
+    private static volatile RemoteControlHttpsServer instance6 = null;
+
+    /** SSL context information for connections */
     private SSLContext sslContext;
 
+    /* the default port for HTTPS remote control */
     private static final int HTTPS_PORT = 8112;
 
@@ -271,30 +273,27 @@
     }
 
-    private void initialize() {
-        if (!initOK) {
-            try {
-                KeyStore ks = loadJosmKeystore();
-
-                KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
-                kmf.init(ks, KEYENTRY_PASSWORD.get().toCharArray());
-
-                TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
-                tmf.init(ks);
-
-                sslContext = SSLContext.getInstance("TLS");
-                sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
-
-                if (Main.isTraceEnabled()) {
-                    Main.trace("SSL Context protocol: " + sslContext.getProtocol());
-                    Main.trace("SSL Context provider: " + sslContext.getProvider());
-                }
-
-                setupPlatform(ks);
-
-                initOK = true;
-            } catch (IOException | GeneralSecurityException e) {
-                Main.error(e);
-            }
-        }
+    /**
+     * Initializes the TLS basics.
+     * @throws IOException if an I/O error occurs
+     * @throws GeneralSecurityException if a security error occurs
+     */
+    private void initialize() throws IOException, GeneralSecurityException {
+        KeyStore ks = loadJosmKeystore();
+
+        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+        kmf.init(ks, KEYENTRY_PASSWORD.get().toCharArray());
+
+        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+        tmf.init(ks);
+
+        sslContext = SSLContext.getInstance("TLS");
+        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
+
+        if (Main.isTraceEnabled()) {
+            Main.trace("SSL Context protocol: " + sslContext.getProtocol());
+            Main.trace("SSL Context provider: " + sslContext.getProvider());
+        }
+
+        setupPlatform(ks);
     }
 
@@ -322,21 +321,24 @@
      */
     public static void restartRemoteControlHttpsServer() {
-        int port = Main.pref.getInteger("remote.control.https.port", HTTPS_PORT);
-        try {
-            stopRemoteControlHttpsServer();
-
-            if (RemoteControl.PROP_REMOTECONTROL_HTTPS_ENABLED.get()) {
-                instance = new RemoteControlHttpsServer(port);
-                if (instance.initOK) {
-                    instance.start();
+        stopRemoteControlHttpsServer();
+        if (RemoteControl.PROP_REMOTECONTROL_HTTPS_ENABLED.get()) {
+            int port = Main.pref.getInteger("remote.control.https.port", HTTPS_PORT);
+            try {
+                instance4 = new RemoteControlHttpsServer(port, false);
+                instance4.start();
+            } catch (Exception ex) {
+                Main.warn(marktr("Cannot start IPv4 remotecontrol https server on port {0}: {1}"),
+                        Integer.toString(port), ex.getLocalizedMessage());
+            }
+            try {
+                instance6 = new RemoteControlHttpsServer(port, true);
+                instance6.start();
+            } catch (Exception ex) {
+                /* only show error when we also have no IPv4 */
+                if(instance4 == null) {
+                    Main.warn(marktr("Cannot start IPv6 remotecontrol https server on port {0}: {1}"),
+                        Integer.toString(port), ex.getLocalizedMessage());
                 }
             }
-        } catch (BindException ex) {
-            Main.warn(marktr("Cannot start remotecontrol https server on port {0}: {1}"),
-                    Integer.toString(port), ex.getLocalizedMessage());
-        } catch (IOException ioe) {
-            Main.error(ioe);
-        } catch (NoSuchAlgorithmException e) {
-            Main.error(e);
         }
     }
@@ -346,12 +348,20 @@
      */
     public static void stopRemoteControlHttpsServer() {
-        if (instance != null) {
+        if (instance4 != null) {
             try {
-                instance.stopServer();
-                instance = null;
+                instance4.stopServer();
+                instance4 = null;
             } catch (IOException ioe) {
                 Main.error(ioe);
             }
         }
+        if (instance6 != null) {
+            try {
+                instance6.stopServer();
+                instance6 = null;
+            } catch (IOException ioe) {
+                Main.error(ioe);
+            }
+        }
     }
 
@@ -359,17 +369,15 @@
      * Constructs a new {@code RemoteControlHttpsServer}.
      * @param port The port this server will listen on
+     * @param ipv6 Whether IPv6 or IPv4 server should be started
      * @throws IOException when connection errors
      * @throws NoSuchAlgorithmException if the JVM does not support TLS (can not happen)
-     */
-    public RemoteControlHttpsServer(int port) throws IOException, NoSuchAlgorithmException {
+     * @throws GeneralSecurityException in case of SSL setup errors
+     * @since 8339
+     */
+    public RemoteControlHttpsServer(int port, boolean ipv6) throws IOException, NoSuchAlgorithmException, GeneralSecurityException {
         super("RemoteControl HTTPS Server");
         this.setDaemon(true);
 
         initialize();
-
-        if (!initOK) {
-            Main.error(tr("Unable to initialize Remote Control HTTPS Server"));
-            return;
-        }
 
         // Create SSL Server factory
@@ -379,18 +387,10 @@
         }
 
-        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;
-        }
+        this.server = factory.createServerSocket(port, 1, ipv6 ?
+            RemoteControl.getInet6Address() : RemoteControl.getInet4Address());
 
         if (Main.isTraceEnabled()) {
-            if(server4 instanceof SSLServerSocket) {
-                SSLServerSocket sslServer = (SSLServerSocket) server4;
+            if(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()));
@@ -400,13 +400,4 @@
                 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());
-            }
         }
     }
@@ -417,58 +408,27 @@
     @Override
     public void run() {
-        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()));
-        }
+        Main.info(marktr("RemoteControl::Accepting secure remote connections on {0}:{1}"),
+                server.getInetAddress(), Integer.toString(server.getLocalPort()));
         while (true) {
-            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);
+            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());
                 }
-            }
-            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);
+                RequestProcessor.processRequest(request);
+            } catch (SocketException se) {
+                if (!server.isClosed()) {
+                    Main.error(se);
                 }
+            } catch (IOException ioe) {
+                Main.error(ioe);
             }
         }
@@ -481,10 +441,7 @@
      */
     public void stopServer() throws IOException {
-        if(server4 != null)
-            server4.close();
-        if(server6 != null)
-            server6.close();
-        if(server6 != null || server4 != null)
-        Main.info(marktr("RemoteControl::Server (IPv6 https) stopped."));
+        Main.info(marktr("RemoteControl::Server {0}:{1} stopped.\n"),
+        server.getInetAddress(), Integer.toString(server.getLocalPort()));
+        server.close();
     }
 }
