Index: trunk/src/org/openstreetmap/josm/actions/SaveAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SaveAction.java	(revision 4113)
+++ trunk/src/org/openstreetmap/josm/actions/SaveAction.java	(revision 4114)
@@ -37,5 +37,6 @@
         }
 
-        // FIXME: why only for GpxLayer?
+        // Ask for overwrite in case of GpxLayer: GpxLayers usually are imports
+        // and modifying is an error most of the time.
         if(f != null && layer instanceof GpxLayer) {
             ExtendedDialog dialog = new ExtendedDialog(
Index: trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 4113)
+++ trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 4114)
@@ -46,12 +46,16 @@
 
     public boolean doSave(Layer layer) {
-        if (layer == null)
-            return false;
-        if ( !(layer instanceof OsmDataLayer) && !(layer instanceof GpxLayer))
-            return false;
-        if (!checkSaveConditions(layer))
-            return false;
-
-        File file = getFile(layer);
+        if(!checkSaveConditions(layer))
+            return false;
+        return doInternalSave(layer, getFile(layer));
+    }
+
+    public boolean doSave(Layer layer, File file) {
+        if(!checkSaveConditions(layer))
+            return false;
+        return doInternalSave(layer, file);
+    }
+
+    private boolean doInternalSave(Layer layer, File file) {
         if (file == null)
             return false;
@@ -91,19 +95,19 @@
      */
     public boolean checkSaveConditions(Layer layer) {
-        if (layer instanceof OsmDataLayer && isDataSetEmpty((OsmDataLayer)layer)) {
-            ExtendedDialog dialog = new ExtendedDialog(
-                    Main.parent,
-                    tr("Empty document"),
-                    new String[] {tr("Save anyway"), tr("Cancel")}
-            );
-            dialog.setContent(tr("The document contains no data."));
-            dialog.setButtonIcons(new String[] {"save.png", "cancel.png"});
-            dialog.showDialog();
-            if (dialog.getValue() != 1) return false;
-        }
-
-        if (layer instanceof GpxLayer && ((GpxLayer)layer).data == null)
-            return false;
-        if (layer instanceof OsmDataLayer)  {
+        if (layer instanceof GpxLayer)
+            return ((GpxLayer)layer).data != null;
+        else if (layer instanceof OsmDataLayer)  {
+            if (isDataSetEmpty((OsmDataLayer)layer)) {
+                ExtendedDialog dialog = new ExtendedDialog(
+                        Main.parent,
+                        tr("Empty document"),
+                        new String[] {tr("Save anyway"), tr("Cancel")}
+                );
+                dialog.setContent(tr("The document contains no data."));
+                dialog.setButtonIcons(new String[] {"save.png", "cancel.png"});
+                dialog.showDialog();
+                if (dialog.getValue() != 1) return false;
+            }
+
             ConflictCollection conflicts = ((OsmDataLayer)layer).getConflicts();
             if (conflicts != null && !conflicts.isEmpty()) {
@@ -119,6 +123,7 @@
                 if (dialog.getValue() != 1) return false;
             }
-        }
-        return true;
+            return true;
+        }
+        return false;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java	(revision 4113)
+++ trunk/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java	(revision 4114)
@@ -48,6 +48,5 @@
         try {
             parentMonitor.subTask(tr("Saving layer to ''{0}'' ...", layerInfo.getFile().toString()));
-            layerInfo.getLayer().setAssociatedFile(layerInfo.getFile());
-            if (!new SaveAction().doSave(layerInfo.getLayer())) {
+            if (!new SaveAction().doSave(layerInfo.getLayer(), layerInfo.getFile())) {
                 setFailed(true);
                 return;
Index: trunk/src/org/openstreetmap/josm/gui/io/SaveLayersModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/SaveLayersModel.java	(revision 4113)
+++ trunk/src/org/openstreetmap/josm/gui/io/SaveLayersModel.java	(revision 4114)
@@ -116,5 +116,5 @@
         List<SaveLayerInfo> ret =new ArrayList<SaveLayerInfo>();
         for (SaveLayerInfo info: layerInfo) {
-            if (info.isDoSaveToFile() && info.getFile() != null && ! info.getFile().canWrite()) {
+            if (info.isDoSaveToFile() && info.getFile() != null && info.getFile().exists() && !info.getFile().canWrite()) {
                 ret.add(info);
             }
