Index: trunk/src/org/openstreetmap/josm/data/AutosaveTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/AutosaveTask.java	(revision 10442)
+++ trunk/src/org/openstreetmap/josm/data/AutosaveTask.java	(revision 10444)
@@ -24,4 +24,6 @@
 import java.util.Timer;
 import java.util.TimerTask;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 import java.util.regex.Pattern;
 
@@ -108,4 +110,7 @@
     }
 
+    /**
+     * Starts the autosave background task.
+     */
     public void schedule() {
         if (PROP_INTERVAL.get() > 0) {
@@ -129,10 +134,5 @@
             timer = new Timer(true);
             timer.schedule(this, 1000L, PROP_INTERVAL.get() * 1000L);
-            Main.getLayerManager().addLayerChangeListener(this);
-            if (Main.isDisplayingMapView()) {
-                for (OsmDataLayer l: Main.getLayerManager().getLayersOfType(OsmDataLayer.class)) {
-                    registerNewlayer(l);
-                }
-            }
+            Main.getLayerManager().addLayerChangeListener(this, true);
         }
     }
@@ -357,13 +357,23 @@
     }
 
-    public void recoverUnsavedLayers() {
+    /**
+     * Recover the unsaved layers and open them asynchronously.
+     * @return A future that can be used to wait for the completion of this task.
+     */
+    public Future<?> recoverUnsavedLayers() {
         List<File> files = getUnsavedLayersFiles();
         final OpenFileTask openFileTsk = new OpenFileTask(files, null, tr("Restoring files"));
-        Main.worker.submit(openFileTsk);
-        Main.worker.submit(new Runnable() {
+        final Future<?> openFilesFuture = Main.worker.submit(openFileTsk);
+        return Main.worker.submit(new Runnable() {
             @Override
             public void run() {
-                for (File f: openFileTsk.getSuccessfullyOpenedFiles()) {
-                    moveToDeletedLayersFolder(f);
+                try {
+                    // Wait for opened tasks to be generated.
+                    openFilesFuture.get();
+                    for (File f: openFileTsk.getSuccessfullyOpenedFiles()) {
+                        moveToDeletedLayersFolder(f);
+                    }
+                } catch (InterruptedException | ExecutionException e) {
+                    Main.error(e);
                 }
             }
@@ -406,4 +416,7 @@
     }
 
+    /**
+     * Mark all unsaved layers as deleted. They are still preserved in the deleted layers folder.
+     */
     public void discardUnsavedLayers() {
         for (File f: getUnsavedLayersFiles()) {
Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 10442)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 10444)
@@ -410,4 +410,5 @@
         final MainFrame mainFrame = new MainFrame(contentPanePrivate, mainPanel, geometry);
         Main.parent = mainFrame;
+        mainPanel.reAddListeners();
 
         if (args.containsKey(Option.LOAD_PREFERENCES)) {
Index: trunk/src/org/openstreetmap/josm/gui/MainPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainPanel.java	(revision 10442)
+++ trunk/src/org/openstreetmap/josm/gui/MainPanel.java	(revision 10444)
@@ -41,5 +41,4 @@
         super(new BorderLayout());
         this.layerManager = layerManager;
-        reAddListeners();
     }
 
