Index: /trunk/linux/latest/usr/bin/josm-latest
===================================================================
--- /trunk/linux/latest/usr/bin/josm-latest	(revision 11161)
+++ /trunk/linux/latest/usr/bin/josm-latest	(revision 11162)
@@ -25,5 +25,5 @@
 fi
 
-JAVA_OPTS="-Djosm.restart=true -Djosm.home=$HOME/.josm-latest -Djava.net.useSystemProxies=true $JAVA_OPTS"
+JAVA_OPTS="-Djosm.restart=true -Djosm.dir.name=JOSM-latest -Djava.net.useSystemProxies=true $JAVA_OPTS"
 
 if [ -z "${JAVACMD}" ]; then
Index: /trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 11161)
+++ /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 11162)
@@ -295,4 +295,19 @@
 
     /**
+     * Get the base name of the JOSM directories for preferences, cache and
+     * user data.
+     * Default value is "JOSM", unless overridden by system property "josm.dir.name".
+     * @return the base name of the JOSM directories for preferences, cache and
+     * user data
+     */
+    public String getJOSMDirectoryBaseName() {
+        String name = System.getProperty("josm.dir.name");
+        if (name != null)
+            return name;
+        else
+            return "JOSM";
+    }
+
+    /**
      * Returns the user defined preferences directory, containing the preferences.xml file
      * @return The user defined preferences directory, containing the preferences.xml file
Index: /trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java	(revision 11161)
+++ /trunk/src/org/openstreetmap/josm/tools/PlatformHookOsx.java	(revision 11162)
@@ -366,15 +366,18 @@
     @Override
     public File getDefaultCacheDirectory() {
-        return new File(System.getProperty("user.home")+"/Library/Caches", "JOSM");
+        return new File(System.getProperty("user.home")+"/Library/Caches",
+                Main.pref.getJOSMDirectoryBaseName());
     }
 
     @Override
     public File getDefaultPrefDirectory() {
-        return new File(System.getProperty("user.home")+"/Library/Preferences", "JOSM");
+        return new File(System.getProperty("user.home")+"/Library/Preferences",
+                Main.pref.getJOSMDirectoryBaseName());
     }
 
     @Override
     public File getDefaultUserDataDirectory() {
-        return new File(System.getProperty("user.home")+"/Library", "JOSM");
+        return new File(System.getProperty("user.home")+"/Library",
+                Main.pref.getJOSMDirectoryBaseName());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java	(revision 11161)
+++ /trunk/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java	(revision 11162)
@@ -18,4 +18,5 @@
 import java.nio.file.Paths;
 import java.util.Arrays;
+import java.util.Locale;
 
 import javax.swing.JOptionPane;
@@ -368,18 +369,66 @@
     }
 
+    /**
+     * Get the dot directory <code>~/.josm</code>.
+     * @return the dot directory
+     */
+    private File getDotDirectory() {
+        String dirName = "." + Main.pref.getJOSMDirectoryBaseName().toLowerCase(Locale.ENGLISH);
+        return new File(System.getProperty("user.home"), dirName);
+    }
+
+    /**
+     * Returns true if the dot directory should be used for storing preferences,
+     * cache and user data.
+     * Currently this is the case, if the dot directory already exists.
+     * @return true if the dot directory should be used
+     */
+    private boolean useDotDirectory() {
+        return getDotDirectory().exists();
+    }
+
     @Override
     public File getDefaultCacheDirectory() {
-        return new File(Main.pref.getUserDataDirectory(), "cache");
+        if (useDotDirectory()) {
+            return new File(getDotDirectory(), "cache");
+        } else {
+            String xdgCacheDir = System.getenv("XDG_CACHE_HOME");
+            if (xdgCacheDir != null && !xdgCacheDir.isEmpty()) {
+                return new File(xdgCacheDir, Main.pref.getJOSMDirectoryBaseName());
+            } else {
+                return new File(System.getProperty("user.home") + File.separator +
+                        ".cache" + File.separator + Main.pref.getJOSMDirectoryBaseName());
+            }
+        }
     }
 
     @Override
     public File getDefaultPrefDirectory() {
-        return new File(System.getProperty("user.home"), ".josm");
+        if (useDotDirectory()) {
+            return getDotDirectory();
+        } else {
+            String xdgConfigDir = System.getenv("XDG_CONFIG_HOME");
+            if (xdgConfigDir != null && !xdgConfigDir.isEmpty()) {
+                return new File(xdgConfigDir, Main.pref.getJOSMDirectoryBaseName());
+            } else {
+                return new File(System.getProperty("user.home") + File.separator +
+                        ".config" + File.separator + Main.pref.getJOSMDirectoryBaseName());
+            }
+        }
     }
 
     @Override
     public File getDefaultUserDataDirectory() {
-        // Use preferences directory by default
-        return Main.pref.getPreferencesDirectory();
+        if (useDotDirectory()) {
+            return getDotDirectory();
+        } else {
+            String xdgDataDir = System.getenv("XDG_DATA_HOME");
+            if (xdgDataDir != null && !xdgDataDir.isEmpty()) {
+                return new File(xdgDataDir, Main.pref.getJOSMDirectoryBaseName());
+            } else {
+                return new File(System.getProperty("user.home") + File.separator +
+                        ".local" + File.separator + "share" + File.separator + Main.pref.getJOSMDirectoryBaseName());
+            }
+        }
     }
 
Index: /trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 11161)
+++ /trunk/src/org/openstreetmap/josm/tools/PlatformHookWindows.java	(revision 11162)
@@ -358,10 +358,10 @@
             p = System.getenv("APPDATA");
         }
-        return new File(new File(p, "JOSM"), "cache");
+        return new File(new File(p, Main.pref.getJOSMDirectoryBaseName()), "cache");
     }
 
     @Override
     public File getDefaultPrefDirectory() {
-        return new File(System.getenv("APPDATA"), "JOSM");
+        return new File(System.getenv("APPDATA"), Main.pref.getJOSMDirectoryBaseName());
     }
 
