Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmBzip2Task.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmBzip2Task.java	(revision 5344)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmBzip2Task.java	(revision 5345)
@@ -3,6 +3,4 @@
 
 import java.util.concurrent.Future;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.openstreetmap.josm.Main;
@@ -49,6 +47,5 @@
         currentBounds = null;
         // Extract .osm.bz/bz2 filename from URL to set the new layer name
-        Matcher matcher = Pattern.compile("http://.*/(.*\\.osm.bz2?)").matcher(url);
-        newLayerName = matcher.matches() ? matcher.group(1) : null;
+        extractOsmFilename("http://.*/(.*\\.osm.bz2?)", url);
         return Main.worker.submit(downloadTask);
     }
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java	(revision 5344)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java	(revision 5345)
@@ -36,5 +36,8 @@
     @Override
     public boolean acceptsUrl(String url) {
-        return url != null && url.matches("http://.*/api/0.6/changeset/\\p{Digit}+/download");
+        return url != null && (
+                url.matches("http://.*/api/0.6/changeset/\\p{Digit}+/download") // OSM API 0.6 changesets
+             || url.matches("http://.*/.*\\.osc")                               // Remote .osc files
+                );
     }
 
@@ -57,4 +60,6 @@
                 new OsmServerLocationReader(url),
                 progressMonitor);
+        // Extract .osc filename from URL to set the new layer name
+        extractOsmFilename("http://.*/(.*\\.osc)", url);
         return Main.worker.submit(downloadTask);
     }
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 5344)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 5345)
@@ -76,7 +76,11 @@
         currentBounds = null;
         // Extract .osm filename from URL to set the new layer name
-        Matcher matcher = Pattern.compile("http://.*/(.*\\.osm)").matcher(url);
+        extractOsmFilename("http://.*/(.*\\.osm)", url);
+        return Main.worker.submit(downloadTask);
+    }
+    
+    protected final void extractOsmFilename(String pattern, String url) {
+        Matcher matcher = Pattern.compile(pattern).matcher(url);
         newLayerName = matcher.matches() ? matcher.group(1) : null;
-        return Main.worker.submit(downloadTask);
     }
     
Index: trunk/src/org/openstreetmap/josm/io/OsmChangeReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmChangeReader.java	(revision 5344)
+++ trunk/src/org/openstreetmap/josm/io/OsmChangeReader.java	(revision 5345)
@@ -4,4 +4,5 @@
 
 import java.io.InputStream;
+import java.util.Arrays;
 
 import javax.xml.stream.XMLStreamConstants;
@@ -14,4 +15,6 @@
 public class OsmChangeReader extends OsmReader {
 
+    public static final String[] ACTIONS = {"create", "modify", "delete"};
+    
     /**
      * constructor (for private and subclasses use only)
@@ -46,10 +49,6 @@
             int event = parser.next();
             if (event == XMLStreamConstants.START_ELEMENT) {
-                if (parser.getLocalName().equals("create")) {
-                    parseCreate();
-                } else if (parser.getLocalName().equals("modify")) {
-                    parseModify();
-                } else if (parser.getLocalName().equals("delete")) {
-                    parseDelete();
+                if (Arrays.asList(ACTIONS).contains(parser.getLocalName())) {
+                    parseCommon(parser.getLocalName());
                 } else {
                     parseUnknown();
@@ -61,17 +60,5 @@
     }
 
-    private void parseDelete() throws XMLStreamException {
-        parseCommon(true);
-    }
-
-    private void parseModify() throws XMLStreamException {
-        parseCommon(false);
-    }
-
-    private void parseCreate() throws XMLStreamException {
-        parseCommon(false);
-    }
-
-    private void parseCommon(boolean deletePrimitive) throws XMLStreamException {
+    private void parseCommon(String action) throws XMLStreamException {
         while (parser.hasNext()) {
             int event = parser.next();
@@ -87,6 +74,10 @@
                     parseUnknown();
                 }
-                if (p != null && deletePrimitive) {
-                    p.setDeleted(true);
+                if (p != null && action != null) {
+                    if (action.equals("modify")) {
+                        p.setModified(true);
+                    } else if (action.equals("delete")) {
+                        p.setDeleted(true);
+                    }
                 }
             } else if (event == XMLStreamConstants.END_ELEMENT) {
