Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 3286)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 3287)
@@ -195,5 +195,5 @@
         if (!pluginsToLoad.isEmpty() && PluginHandler.checkAndConfirmPluginUpdate(splash)) {
             monitor.subTask(tr("Updating plugins..."));
-            PluginHandler.updatePlugins(splash,pluginsToLoad, monitor.createSubTaskMonitor(1, false));
+            pluginsToLoad = PluginHandler.updatePlugins(splash,pluginsToLoad, monitor.createSubTaskMonitor(1, false));
         }
         monitor.worked(1);
Index: trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 3286)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 3287)
@@ -620,5 +620,7 @@
      * @throws IllegalArgumentException thrown if plugins is null
      */
-    public static void updatePlugins(Window parent, Collection<PluginInformation> plugins, ProgressMonitor monitor) throws IllegalArgumentException{
+    public static List<PluginInformation>  updatePlugins(Window parent,
+    List<PluginInformation> plugins, ProgressMonitor monitor)
+    throws IllegalArgumentException{
         CheckParameterUtil.ensureParameterNotNull(plugins, "plugins");
         if (monitor == null) {
@@ -638,4 +640,5 @@
             try {
                 future.get();
+                plugins = buildListOfPluginsToLoad(parent,monitor.createSubTaskMonitor(1, false));
             } catch(ExecutionException e) {
                 System.out.println(tr("Warning: failed to download plugin information list"));
@@ -672,9 +675,9 @@
                     e.printStackTrace();
                     alertFailedPluginUpdate(parent, pluginsToUpdate);
-                    return;
+                    return plugins;
                 } catch(InterruptedException e) {
                     e.printStackTrace();
                     alertFailedPluginUpdate(parent, pluginsToUpdate);
-                    return;
+                    return plugins;
                 }
                 // notify user if downloading a locally installed plugin failed
@@ -682,5 +685,5 @@
                 if (! task2.getFailedPlugins().isEmpty()) {
                     alertFailedPluginUpdate(parent, task2.getFailedPlugins());
-                    return;
+                    return plugins;
                 }
             }
@@ -692,4 +695,5 @@
         Main.pref.putInteger("pluginmanager.version", Version.getInstance().getVersion());
         Main.pref.put("pluginmanager.lastupdate", Long.toString(System.currentTimeMillis()));
+        return plugins;
     }
 
Index: trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 3286)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 3287)
@@ -351,4 +351,5 @@
      */
     public boolean isUpdateRequired(String referenceVersion) {
+        if (this.downloadlink == null) return false;
         if (this.version == null && referenceVersion!= null)
             return true;
@@ -366,4 +367,5 @@
      */
     public boolean isUpdateRequired() {
+        if (this.downloadlink == null) return false;
         if (this.localversion == null) return true;
         return isUpdateRequired(this.localversion);
Index: trunk/src/org/openstreetmap/josm/plugins/ReadLocalPluginInformationTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/ReadLocalPluginInformationTask.java	(revision 3286)
+++ trunk/src/org/openstreetmap/josm/plugins/ReadLocalPluginInformationTask.java	(revision 3287)
@@ -62,4 +62,5 @@
         );
         if (!availablePlugins.containsKey(info.getName())) {
+            info.localversion = info.version;
             availablePlugins.put(info.getName(), info);
         } else {
@@ -184,5 +185,5 @@
         Collection<String> pluginLocations = PluginInformation.getPluginLocations();
         getProgressMonitor().setTicksCount(pluginLocations.size() + 2);
-        if (canceled)return;
+        if (canceled) return;
         for (String location : pluginLocations) {
             scanLocalPluginRepository(
Index: trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java	(revision 3286)
+++ trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java	(revision 3287)
@@ -7,4 +7,5 @@
 import java.io.ByteArrayInputStream;
 import java.io.File;
+import java.io.FilenameFilter;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -43,5 +44,5 @@
     private boolean canceled;
     private HttpURLConnection connection;
-    private List<PluginInformation> availabePlugins;
+    private List<PluginInformation> availablePlugins;
 
     protected void init(Collection<String> sites){
@@ -50,5 +51,5 @@
             this.sites = Collections.emptySet();
         }
-        availabePlugins = new LinkedList<PluginInformation>();
+        availablePlugins = new LinkedList<PluginInformation>();
 
     }
@@ -94,5 +95,6 @@
      * @return the file name for the cache file
      */
-    protected String createSiteCacheFileName(String site) {
+    protected File createSiteCacheFile(File pluginDir, String site) {
+        String name;
         try {
             URL url = new URL(site);
@@ -113,8 +115,9 @@
             }
             sb.append(".txt");
-            return sb.toString();
+            name = sb.toString();
         } catch(MalformedURLException e) {
-            return "site-unknown.txt";
-        }
+            name = "site-unknown.txt";
+        }
+        return new File(pluginDir, name);
     }
 
@@ -186,5 +189,5 @@
                 }
             }
-            File cacheFile = new File(pluginDir, createSiteCacheFileName(site));
+            File cacheFile = createSiteCacheFile(pluginDir, site);
             getProgressMonitor().subTask(tr("Writing plugin list to local cache ''{0}''", cacheFile.toString()));
             writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(cacheFile), "utf-8"));
@@ -231,5 +234,5 @@
             InputStream in = new ByteArrayInputStream(doc.getBytes("UTF-8"));
             List<PluginInformation> pis = new PluginListParser().parse(in);
-            availabePlugins.addAll(filterDeprecatedPlugins(pis));
+            availablePlugins.addAll(filterDeprecatedPlugins(pis));
         } catch(UnsupportedEncodingException e) {
             System.err.println(tr("Failed to parse plugin list document from site ''{0}''. Skipping site. Exception was: {1}", site, e.toString()));
@@ -245,15 +248,38 @@
         if (sites == null) return;
         getProgressMonitor().setTicksCount(sites.size() * 3);
+        File pluginDir = Main.pref.getPluginsDirectory();
+        List<File> siteCacheFiles = new LinkedList<File>();
+        for (String location : PluginInformation.getPluginLocations()) {
+            File [] f = new File(location).listFiles(
+                new FilenameFilter() {
+                    public boolean accept(File dir, String name) {
+                        return name.matches("^([0-9]+-)?site.*\\.txt$");
+                    }
+                }
+            );
+            if(f != null && f.length > 0)
+                siteCacheFiles.addAll(Arrays.asList(f));
+        }
+
         for (String site: sites) {
             getProgressMonitor().subTask(tr("Processing plugin list from site ''{0}''", site));
             String list = downloadPluginList(site, getProgressMonitor().createSubTaskMonitor(0, false));
-            if (canceled || list == null) return;
-            getProgressMonitor().worked(1);
-            cachePluginList(site, list);
             if (canceled) return;
-            getProgressMonitor().worked(1);
-            parsePluginListDocument(site, list);
-            if (canceled) return;
-            getProgressMonitor().worked(1);
+            if(list != null)
+            {
+                siteCacheFiles.remove(createSiteCacheFile(pluginDir, site));
+                getProgressMonitor().worked(1);
+                cachePluginList(site, list);
+                if (canceled) return;
+                getProgressMonitor().worked(1);
+                parsePluginListDocument(site, list);
+                if (canceled) return;
+                getProgressMonitor().worked(1);
+                if (canceled) return;
+            }
+        }
+        for (File file: siteCacheFiles) /* remove old stuff or whole update process is broken */
+        {
+            file.delete();
         }
     }
@@ -273,5 +299,5 @@
      */
     public List<PluginInformation> getAvailabePlugins() {
-        return availabePlugins;
+        return availablePlugins;
     }
 }
