Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/NoteImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/NoteImporter.java	(revision 13112)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/NoteImporter.java	(revision 13114)
@@ -25,5 +25,9 @@
 public class NoteImporter extends FileImporter {
 
-    private static final ExtensionFileFilter FILE_FILTER = ExtensionFileFilter.newFilterWithArchiveExtensions(
+    /**
+     * The Notes file filter (*.osn files).
+     * @since 13114
+     */
+    public static final ExtensionFileFilter FILE_FILTER = ExtensionFileFilter.newFilterWithArchiveExtensions(
             "osn", "osn", tr("Note Files"), true);
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/AutosaveTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AutosaveTask.java	(revision 13112)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AutosaveTask.java	(revision 13114)
@@ -31,4 +31,6 @@
 import org.openstreetmap.josm.actions.OpenFileAction.OpenFileTask;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.NoteData;
+import org.openstreetmap.josm.data.osm.NoteData.NoteDataUpdateListener;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter;
@@ -38,4 +40,6 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
+import org.openstreetmap.josm.gui.io.importexport.NoteExporter;
+import org.openstreetmap.josm.gui.io.importexport.NoteImporter;
 import org.openstreetmap.josm.gui.io.importexport.OsmExporter;
 import org.openstreetmap.josm.gui.io.importexport.OsmImporter;
@@ -50,5 +54,5 @@
 
 /**
- * Saves data layers periodically so they can be recovered in case of a crash.
+ * Saves data and note layers periodically so they can be recovered in case of a crash.
  *
  * There are 2 directories
@@ -68,5 +72,5 @@
  * @since 10386 (new LayerChangeListener interface)
  */
-public class AutosaveTask extends TimerTask implements LayerChangeListener, Listener {
+public class AutosaveTask extends TimerTask implements LayerChangeListener, Listener, NoteDataUpdateListener {
 
     private static final char[] ILLEGAL_CHARACTERS = {'/', '\n', '\r', '\t', '\0', '\f', '`', '?', '*', '\\', '<', '>', '|', '\"', ':'};
@@ -99,11 +103,11 @@
     public static final BooleanProperty PROP_NOTIFICATION = new BooleanProperty("autosave.notification", false);
 
-    protected static final class AutosaveLayerInfo {
-        private final OsmDataLayer layer;
+    protected static final class AutosaveLayerInfo<T extends AbstractModifiableLayer> {
+        private final T layer;
         private String layerName;
         private String layerFileName;
         private final Deque<File> backupFiles = new LinkedList<>();
 
-        AutosaveLayerInfo(OsmDataLayer layer) {
+        AutosaveLayerInfo(T layer) {
             this.layer = layer;
         }
@@ -112,5 +116,6 @@
     private final DataSetListenerAdapter datasetAdapter = new DataSetListenerAdapter(this);
     private final Set<DataSet> changedDatasets = new HashSet<>();
-    private final List<AutosaveLayerInfo> layersInfo = new ArrayList<>();
+    private final Set<NoteData> changedNoteData = new HashSet<>();
+    private final List<AutosaveLayerInfo<?>> layersInfo = new ArrayList<>();
     private final Object layersLock = new Object();
     private final Deque<File> deletedLayers = new LinkedList<>();
@@ -167,10 +172,10 @@
     }
 
-    private void setLayerFileName(AutosaveLayerInfo layer) {
+    private void setLayerFileName(AutosaveLayerInfo<?> layer) {
         int index = 0;
         while (true) {
             String filename = getFileName(layer.layer.getName(), index);
             boolean foundTheSame = false;
-            for (AutosaveLayerInfo info: layersInfo) {
+            for (AutosaveLayerInfo<?> info: layersInfo) {
                 if (info != layer && filename.equals(info.layerFileName)) {
                     foundTheSame = true;
@@ -188,10 +193,13 @@
     }
 
-    protected File getNewLayerFile(AutosaveLayerInfo layer, Date now, int startIndex) {
+    protected File getNewLayerFile(AutosaveLayerInfo<?> layer, Date now, int startIndex) {
         int index = startIndex;
         while (true) {
             String filename = String.format("%1$s_%2$tY%2$tm%2$td_%2$tH%2$tM%2$tS%2$tL%3$s",
                     layer.layerFileName, now, index == 0 ? "" : ('_' + Integer.toString(index)));
-            File result = new File(autosaveDir, filename + '.' + Config.getPref().get("autosave.extension", "osm"));
+            File result = new File(autosaveDir, filename + '.' +
+                    (layer.layer instanceof NoteLayer ?
+                            Config.getPref().get("autosave.notes.extension", "osn") :
+                            Config.getPref().get("autosave.extension", "osm")));
             try {
                 if (index > PROP_INDEX_LIMIT.get())
@@ -220,15 +228,31 @@
     }
 
-    private void savelayer(AutosaveLayerInfo info) {
+    private void savelayer(AutosaveLayerInfo<?> info) {
         if (!info.layer.getName().equals(info.layerName)) {
             setLayerFileName(info);
             info.layerName = info.layer.getName();
         }
-        if (changedDatasets.remove(info.layer.data)) {
-            File file = getNewLayerFile(info, new Date(), 0);
-            if (file != null) {
-                info.backupFiles.add(file);
-                new OsmExporter().exportData(file, info.layer, true /* no backup with appended ~ */);
-            }
+        try {
+            if (info.layer instanceof OsmDataLayer) {
+                OsmDataLayer dataLayer = (OsmDataLayer) info.layer;
+                if (changedDatasets.remove(dataLayer.data)) {
+                    File file = getNewLayerFile(info, new Date(), 0);
+                    if (file != null) {
+                        info.backupFiles.add(file);
+                        new OsmExporter().exportData(file, info.layer, true /* no backup with appended ~ */);
+                    }
+                }
+            } else if (info.layer instanceof NoteLayer) {
+                NoteLayer noteLayer = (NoteLayer) info.layer;
+                if (changedNoteData.remove(noteLayer.getNoteData())) {
+                    File file = getNewLayerFile(info, new Date(), 0);
+                    if (file != null) {
+                        info.backupFiles.add(file);
+                        new NoteExporter().exportData(file, info.layer);
+                    }
+                }
+            }
+        } catch (IOException e) {
+            Logging.error(e);
         }
         while (info.backupFiles.size() > PROP_FILES_PER_LAYER.get()) {
@@ -244,8 +268,9 @@
         synchronized (layersLock) {
             try {
-                for (AutosaveLayerInfo info: layersInfo) {
+                for (AutosaveLayerInfo<?> info: layersInfo) {
                     savelayer(info);
                 }
                 changedDatasets.clear();
+                changedNoteData.clear();
                 if (PROP_NOTIFICATION.get() && !layersInfo.isEmpty()) {
                     GuiHelper.runInEDT(this::displayNotification);
@@ -273,5 +298,12 @@
         synchronized (layersLock) {
             layer.data.addDataSetListener(datasetAdapter);
-            layersInfo.add(new AutosaveLayerInfo(layer));
+            layersInfo.add(new AutosaveLayerInfo<>(layer));
+        }
+    }
+
+    private void registerNewlayer(NoteLayer layer) {
+        synchronized (layersLock) {
+            layer.getNoteData().addNoteDataUpdateListener(this);
+            layersInfo.add(new AutosaveLayerInfo<>(layer));
         }
     }
@@ -281,4 +313,6 @@
         if (e.getAddedLayer() instanceof OsmDataLayer) {
             registerNewlayer((OsmDataLayer) e.getAddedLayer());
+        } else if (e.getAddedLayer() instanceof NoteLayer) {
+            registerNewlayer((NoteLayer) e.getAddedLayer());
         }
     }
@@ -290,23 +324,33 @@
                 OsmDataLayer osmLayer = (OsmDataLayer) e.getRemovedLayer();
                 osmLayer.data.removeDataSetListener(datasetAdapter);
-                Iterator<AutosaveLayerInfo> it = layersInfo.iterator();
-                while (it.hasNext()) {
-                    AutosaveLayerInfo info = it.next();
-                    if (info.layer == osmLayer) {
-
-                        savelayer(info);
-                        File lastFile = info.backupFiles.pollLast();
-                        if (lastFile != null) {
-                            moveToDeletedLayersFolder(lastFile);
-                        }
-                        for (File file: info.backupFiles) {
-                            if (Utils.deleteFile(file)) {
-                                Utils.deleteFile(getPidFile(file));
-                            }
-                        }
-
-                        it.remove();
+                cleanupLayer(osmLayer);
+            }
+        } else if (e.getRemovedLayer() instanceof NoteLayer) {
+            synchronized (layersLock) {
+                NoteLayer noteLayer = (NoteLayer) e.getRemovedLayer();
+                noteLayer.getNoteData().removeNoteDataUpdateListener(this);
+                cleanupLayer(noteLayer);
+            }
+        }
+    }
+
+    private void cleanupLayer(AbstractModifiableLayer removedLayer) {
+        Iterator<AutosaveLayerInfo<?>> it = layersInfo.iterator();
+        while (it.hasNext()) {
+            AutosaveLayerInfo<?> info = it.next();
+            if (info.layer == removedLayer) {
+
+                savelayer(info);
+                File lastFile = info.backupFiles.pollLast();
+                if (lastFile != null) {
+                    moveToDeletedLayersFolder(lastFile);
+                }
+                for (File file: info.backupFiles) {
+                    if (Utils.deleteFile(file)) {
+                        Utils.deleteFile(getPidFile(file));
                     }
                 }
+
+                it.remove();
             }
         }
@@ -316,4 +360,14 @@
     public void processDatasetEvent(AbstractDatasetChangedEvent event) {
         changedDatasets.add(event.getDataset());
+    }
+
+    @Override
+    public void noteDataUpdated(NoteData data) {
+        changedNoteData.add(data);
+    }
+
+    @Override
+    public void selectedNoteChanged(NoteData noteData) {
+        // Do nothing
     }
 
@@ -329,5 +383,6 @@
     public List<File> getUnsavedLayersFiles() {
         List<File> result = new ArrayList<>();
-        File[] files = autosaveDir.listFiles(OsmImporter.FILE_FILTER);
+        File[] files = autosaveDir.listFiles((FileFilter)
+                pathname -> OsmImporter.FILE_FILTER.accept(pathname) || NoteImporter.FILE_FILTER.accept(pathname));
         if (files == null)
             return result;
