Index: src/org/openstreetmap/josm/plugins/PluginInformation.java
===================================================================
--- src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 868)
+++ src/org/openstreetmap/josm/plugins/PluginInformation.java	(working copy)
@@ -195,7 +195,7 @@
         Collection<String> locations = getPluginLocations();
 
        	for (String s : locations) {
-       		File pluginFile = new File(s+"/"+pluginName+".jar");
+       		File pluginFile = new File(s, pluginName + ".jar");
        		if (pluginFile.exists()) {
 				PluginInformation info = new PluginInformation(pluginFile);
 				return info;
Index: src/org/openstreetmap/josm/plugins/PluginDownloader.java
===================================================================
--- src/org/openstreetmap/josm/plugins/PluginDownloader.java	(revision 868)
+++ src/org/openstreetmap/josm/plugins/PluginDownloader.java	(working copy)
@@ -12,6 +12,7 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileWriter;
+import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -53,14 +54,17 @@
 		}
 
 		@Override protected void realRun() throws SAXException, IOException {
+			File pluginDir = Main.pref.getPluginsDirFile();
+			if (!pluginDir.exists())
+				pluginDir.mkdirs();
 			for (PluginDescription d : toUpdate) {
-				File tempFile = new File(Main.pref.getPreferencesDir()+"temp.jar");
-				if (download(d.resource, tempFile)) {
-					tempFile.renameTo(new File(Main.pref.getPreferencesDir()+"plugins/"+d.name+".jar"));
+				File pluginFile = new File(pluginDir, d.name + ".jar.new");
+				if (download(d.resource, pluginFile))
 					count++;
-				} else
+				else
 					errors += d.name + "\n";
 			}
+			PluginDownloader.moveUpdatedPlugins();
 		}
 	}
 
@@ -78,7 +82,9 @@
 					txt = readWiki(r);
 				r.close();
 				new File(Main.pref.getPreferencesDir()+"plugins").mkdir();
-				FileWriter out = new FileWriter(Main.pref.getPreferencesDir()+"plugins/"+count+"-site-"+site.replaceAll("[/:\\\\ <>|]", "_")+".xml");
+				FileWriter out = new FileWriter(new File(Main.pref
+				        .getPluginsDirFile(), count + "-site-"
+				        + site.replaceAll("[/:\\\\ <>|]", "_") + ".xml"));
 				out.append(txt);
 				out.close();
 				count++;
@@ -122,7 +128,7 @@
 	}
 
 	public static boolean downloadPlugin(PluginDescription pd) {
-		File file = new File(Main.pref.getPreferencesDir()+"plugins/"+pd.name+".jar");
+		File file = new File(Main.pref.getPluginsDirFile(), pd.name + ".jar");
 		if (!download(pd.resource, file)) {
 			JOptionPane.showMessageDialog(Main.parent, tr("Could not download plugin: {0} from {1}", pd.name, pd.resource));
 		} else {
@@ -162,4 +168,21 @@
 	public static void update(Collection<PluginDescription> update) {
 		Main.worker.execute(new UpdateTask(update));
 	}
+	
+	public static boolean moveUpdatedPlugins() {
+		File pluginDir = Main.pref.getPluginsDirFile();
+		boolean ok = true; 		
+		if (pluginDir.exists() && pluginDir.isDirectory()) {
+			final File[] files = pluginDir.listFiles(new FilenameFilter() {
+				public boolean accept(File dir, String name) {
+	                return name.endsWith(".new");
+                }});
+			for (File updatedPlugin : files) {
+				final String filePath = updatedPlugin.getPath();
+				File plugin = new File(filePath.substring(0, filePath.length() - 4));
+				ok = plugin.delete() && updatedPlugin.renameTo(plugin) && ok;
+			}
+		}
+		return ok;
+	}
 }
Index: src/org/openstreetmap/josm/plugins/Plugin.java
===================================================================
--- src/org/openstreetmap/josm/plugins/Plugin.java	(revision 868)
+++ src/org/openstreetmap/josm/plugins/Plugin.java	(working copy)
@@ -52,7 +52,7 @@
 	 * @return The directory for the plugin to store all kind of stuff.
 	 */
 	public final String getPluginDir() {
-		return Main.pref.getPreferencesDir()+"plugins/"+info.name+"/";
+		return new File(Main.pref.getPluginsDirFile(), info.name).getPath();
 	}
 
 	/**
Index: src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainApplication.java	(revision 868)
+++ src/org/openstreetmap/josm/gui/MainApplication.java	(working copy)
@@ -21,6 +21,7 @@
 import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.plugins.PluginDownloader;
 import org.openstreetmap.josm.tools.BugReportExceptionHandler;
 /**
  * Main window class application.
@@ -83,7 +84,7 @@
 		// get the preferences.
 		final File prefDir = new File(Main.pref.getPreferencesDir());
 		// check if preferences directory has moved (TODO: Update code. Remove this after some time)
-		File oldPrefDir = new File(System.getProperty("user.home")+"/.josm");
+		File oldPrefDir = new File(System.getProperty("user.home"), ".josm");
 		if (!prefDir.isDirectory() && oldPrefDir.isDirectory()) {
 			if (oldPrefDir.renameTo(prefDir)) {
 				// do not translate this
@@ -118,6 +119,12 @@
 			Main.pref.save();
 		}
 
+		if (!PluginDownloader.moveUpdatedPlugins()) {
+			JOptionPane.showMessageDialog(null,
+			        tr("Activating the updated plugins failed."),
+			        tr("Plugins"), JOptionPane.ERROR_MESSAGE);
+		}
+		
 		// load the early plugins
 		Main.loadPlugins(true);
 
Index: src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- src/org/openstreetmap/josm/data/Preferences.java	(revision 868)
+++ src/org/openstreetmap/josm/data/Preferences.java	(working copy)
@@ -71,10 +71,21 @@
 	 * Return the location of the user defined preferences file
 	 */
 	public String getPreferencesDir() {
+		final String path = getPreferencesDirFile().getPath();
+		if (path.endsWith(File.separator))
+			return path;
+		return path + File.separator;
+	}
+
+	public File getPreferencesDirFile() {
 		if (System.getenv("APPDATA") != null)
-			return System.getenv("APPDATA")+"/JOSM/";
-		return System.getProperty("user.home")+"/.josm/";
+			return new File(System.getenv("APPDATA"), "JOSM");
+		return new File(System.getProperty("user.home"), ".josm");
 	}
+	
+	public File getPluginsDirFile() {
+		return new File(getPreferencesDirFile(), "plugins");
+	}
 
 	/**
 	 * @return A list of all existing directories where resources could be stored.
@@ -84,19 +95,21 @@
 		locations.add(Main.pref.getPreferencesDir());
 		String s;
 		if ((s = System.getenv("JOSM_RESOURCES")) != null) {
-			if (!s.endsWith("/") && !s.endsWith("\\"))
-				s = s + "/";
+			if (!s.endsWith(File.separator))
+				s = s + File.separator;
 			locations.add(s);
 		}
 		if ((s = System.getProperty("josm.resources")) != null) {
-			if (!s.endsWith("/") && !s.endsWith("\\"))
-				s = s + "/";
+			if (!s.endsWith(File.separator))
+				s = s + File.separator;
 			locations.add(s);
 		}
 		String appdata = System.getenv("APPDATA");
-		if (System.getenv("ALLUSERSPROFILE") != null && appdata != null && appdata.lastIndexOf("\\") != -1) {
-			appdata = appdata.substring(appdata.lastIndexOf("\\"));
-			locations.add(System.getenv("ALLUSERSPROFILE")+appdata+"/JOSM/");
+		if (System.getenv("ALLUSERSPROFILE") != null && appdata != null
+		        && appdata.lastIndexOf(File.separator) != -1) {
+			appdata = appdata.substring(appdata.lastIndexOf(File.separator));
+			locations.add(new File(new File(System.getenv("ALLUSERSPROFILE"),
+			        appdata), "JOSM").getPath());
 		}
 		locations.add("/usr/local/share/josm/");
 		locations.add("/usr/local/lib/josm/");
