Index: trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java	(revision 8239)
+++ trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java	(revision 8240)
@@ -31,4 +31,5 @@
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmChangeTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmCompressedTask;
+import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmIdTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmUrlTask;
@@ -68,4 +69,5 @@
         addDownloadTaskClass(DownloadOsmChangeTask.class);
         addDownloadTaskClass(DownloadOsmUrlTask.class);
+        addDownloadTaskClass(DownloadOsmIdTask.class);
         addDownloadTaskClass(DownloadOsmCompressedTask.class);
         addDownloadTaskClass(DownloadOsmChangeCompressedTask.class);
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesUrlIdTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesUrlIdTask.java	(revision 8239)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesUrlIdTask.java	(revision 8240)
@@ -17,9 +17,7 @@
     public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
         final Matcher matcher = Pattern.compile(URL_ID_PATTERN).matcher(url);
-        final long id;
-        try {
-            matcher.matches();
+        if (matcher.matches()) {
             return download(newLayer, Long.parseLong(matcher.group(2)), null);
-        } catch (RuntimeException ex) {
+        } else {
             throw new IllegalStateException("Failed to parse note id from " + url);
         }
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java	(revision 8239)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java	(revision 8240)
@@ -10,4 +10,6 @@
 import java.util.Map;
 import java.util.concurrent.Future;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.openstreetmap.josm.Main;
@@ -32,4 +34,5 @@
 import org.openstreetmap.josm.gui.history.HistoryLoadTask;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.io.OsmServerLocationReader;
 import org.openstreetmap.josm.io.OsmServerReader;
@@ -42,7 +45,10 @@
 public class DownloadOsmChangeTask extends DownloadOsmTask {
 
+    private static final String OSM_WEBSITE_PATTERN = "https?://www\\.(osm|openstreetmap)\\.org/changeset/(\\p{Digit}+).*";
+
     @Override
     public String[] getPatterns() {
         return new String[]{"https?://.*/api/0.6/changeset/\\p{Digit}+/download", // OSM API 0.6 changesets
+            OSM_WEBSITE_PATTERN, // OSM changesets
             "https?://.*/.*\\.osc" // Remote .osc files
         };
@@ -61,9 +67,10 @@
 
     @Override
-    public Future<?> loadUrl(boolean new_layer, String url,
-            ProgressMonitor progressMonitor) {
-        downloadTask = new DownloadTask(new_layer,
-                new OsmServerLocationReader(url),
-                progressMonitor);
+    public Future<?> loadUrl(boolean new_layer, String url, ProgressMonitor progressMonitor) {
+        final Matcher matcher = Pattern.compile(OSM_WEBSITE_PATTERN).matcher(url);
+        if (matcher.matches()) {
+            url = OsmApi.getOsmApi().getBaseUrl() + "changeset/" + Long.parseLong(matcher.group(2)) + "/download";
+        }
+        downloadTask = new DownloadTask(new_layer, new OsmServerLocationReader(url), progressMonitor);
         // Extract .osc filename from URL to set the new layer name
         extractOsmFilename("https?://.*/(.*\\.osc)", url);
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmIdTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmIdTask.java	(revision 8240)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmIdTask.java	(revision 8240)
@@ -0,0 +1,46 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.downloadtasks;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.Collections;
+import java.util.concurrent.Future;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+
+public class DownloadOsmIdTask extends DownloadOsmTask {
+
+    private static final String URL_ID_PATTERN = "https?://www\\.(osm|openstreetmap)\\.org/(node|way|relation)/(\\p{Digit}+).*";
+
+    @Override
+    public String[] getPatterns() {
+        return new String[]{URL_ID_PATTERN};
+    }
+
+    @Override
+    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
+        final Matcher matcher = Pattern.compile(URL_ID_PATTERN).matcher(url);
+        if (matcher.matches()) {
+            final OsmPrimitiveType type = OsmPrimitiveType.from(matcher.group(2));
+            final long id = Long.parseLong(matcher.group(3));
+            final PrimitiveId primitiveId = new SimplePrimitiveId(id, type);
+            final DownloadPrimitivesWithReferrersTask downloadTask = new DownloadPrimitivesWithReferrersTask(
+                    newLayer, Collections.singletonList(primitiveId), true, true, null, null);
+            return Main.worker.submit(downloadTask);
+        } else {
+            throw new IllegalStateException("Failed to parse id from " + url);
+        }
+    }
+
+    @Override
+    public String getTitle() {
+        return tr("Download OSM object by ID");
+    }
+}
