Index: trunk/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java	(revision 4795)
+++ trunk/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java	(revision 4796)
@@ -200,5 +200,11 @@
     }
 
-    void processItems(boolean newLayer, final List<PrimitiveId> ids, boolean downloadReferrers, boolean full) {
+    /**
+     * @param newLayer if the data should be downloaded into a new layer
+     * @param ids
+     * @param downloadReferrers if the referrers of the object should be downloaded as well, i.e., parent relations, and for nodes, additionally, parent ways
+     * @param full if the members of a relation should be downloaded as well
+     */
+    public static void processItems(boolean newLayer, final List<PrimitiveId> ids, boolean downloadReferrers, boolean full) {
         OsmDataLayer layer = getEditLayer();
         if ((layer == null) || newLayer) {
@@ -274,5 +280,5 @@
     }
 
-    private ExtendedDialog reportProblemDialog(Set<PrimitiveId> errs,
+    private static ExtendedDialog reportProblemDialog(Set<PrimitiveId> errs,
             String TITLE, String TEXT, String LIST_LABEL, int msgType) {
         JPanel p = new JPanel(new GridBagLayout());
Index: trunk/src/org/openstreetmap/josm/data/osm/SimplePrimitiveId.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/SimplePrimitiveId.java	(revision 4795)
+++ trunk/src/org/openstreetmap/josm/data/osm/SimplePrimitiveId.java	(revision 4796)
@@ -3,4 +3,6 @@
 
 import java.io.Serializable;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class SimplePrimitiveId implements PrimitiveId, Serializable {
@@ -57,3 +59,23 @@
         return type + " " + id;
     }
+
+    /**
+     * Parses a {@code OsmPrimitiveType} from the string {@code s}.
+     * @param s the string to be parsed, e.g., {@code n1}, {@code node1},
+     * {@code w1}, {@code way1}, {@code r1}, {@code rel1}, {@code relation1}.
+     * @return the parsed {@code OsmPrimitiveType}
+     * @throws IllegalArgumentException if the string does not match the pattern
+     */
+    public static SimplePrimitiveId fromString(String s) {
+        final Pattern p = Pattern.compile("((n(ode)?|w(ay)?|r(el(ation)?)?)/?)(\\d+)");
+        final Matcher m = p.matcher(s);
+        if (m.matches()) {
+            return new SimplePrimitiveId(Long.parseLong(m.group(m.groupCount())),
+                    s.charAt(0) == 'n' ? OsmPrimitiveType.NODE
+                    : s.charAt(0) == 'w' ? OsmPrimitiveType.WAY
+                    : OsmPrimitiveType.RELATION);
+        } else {
+            throw new IllegalArgumentException("The string " + s + " does not match the pattern " + p);
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/widgets/OsmIdTextField.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/OsmIdTextField.java	(revision 4795)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/OsmIdTextField.java	(revision 4796)
@@ -92,36 +92,35 @@
         
         public boolean readOsmIds() {
-            String value  = getComponent().getText();
+            String value = getComponent().getText();
             char c;
-            if (value == null || value.trim().length() == 0) return false;
-            try {
-                ids.clear();
-                StringTokenizer st = new StringTokenizer(value,",.+/ \t\n");
-                String s;
-                while (st.hasMoreTokens()) {
-                    s = st.nextToken();
-                    // convert tokens to int skipping v-words (version v2 etc)
-                    c = s.charAt(0);
-                    if (c=='v') {
-                        continue;
-                    }
-                    else if (c=='n') {
-                        ids.add(new SimplePrimitiveId(Long.parseLong(s.substring(1)), OsmPrimitiveType.NODE));
-                    } else if (c=='w') {
-                        ids.add(new SimplePrimitiveId(Long.parseLong(s.substring(1)), OsmPrimitiveType.WAY));
-                    } else if (c=='r') { 
-                        ids.add(new SimplePrimitiveId(Long.parseLong(s.substring(1)), OsmPrimitiveType.RELATION));
-                    } else if (type==OsmPrimitiveType.NODE) {
-                        ids.add(new SimplePrimitiveId(Long.parseLong(s), OsmPrimitiveType.NODE));
-                    } else if (type==OsmPrimitiveType.WAY) {
-                        ids.add(new SimplePrimitiveId(Long.parseLong(s), OsmPrimitiveType.WAY));
-                    } else if (type==OsmPrimitiveType.RELATION) {
-                        ids.add(new SimplePrimitiveId(Long.parseLong(s), OsmPrimitiveType.RELATION));
+            if (value == null || value.trim().length() == 0) {
+                return false;
+            }
+            ids.clear();
+            StringTokenizer st = new StringTokenizer(value, ",.+/ \t\n");
+            String s;
+            while (st.hasMoreTokens()) {
+                s = st.nextToken();
+                // convert tokens to int skipping v-words (version v2 etc)
+                c = s.charAt(0);
+                if (c == 'v') {
+                    continue;
+                } else {
+                    try {
+                        ids.add(SimplePrimitiveId.fromString(s));
+                    } catch (IllegalArgumentException ex) {
+                        if (type == OsmPrimitiveType.NODE) {
+                            ids.add(new SimplePrimitiveId(Long.parseLong(s), OsmPrimitiveType.NODE));
+                        } else if (type == OsmPrimitiveType.WAY) {
+                            ids.add(new SimplePrimitiveId(Long.parseLong(s), OsmPrimitiveType.WAY));
+                        } else if (type == OsmPrimitiveType.RELATION) {
+                            ids.add(new SimplePrimitiveId(Long.parseLong(s), OsmPrimitiveType.RELATION));
+                        } else {
+                            return false;
+                        }
                     }
                 }
-                return true;
-            } catch(NumberFormatException e) {
-                return false;
             }
+            return true;
         }
     }
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 4795)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 4796)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.io.remotecontrol.handler.ImportHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.LoadAndZoomHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.LoadObject;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
@@ -117,4 +118,5 @@
         addRequestHandlerClass(ImportHandler.command, ImportHandler.class, true);
         addRequestHandlerClass(VersionHandler.command, VersionHandler.class, true);
+        addRequestHandlerClass(LoadObject.command, LoadObject.class, true);
     }
 
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObject.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObject.java	(revision 4796)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObject.java	(revision 4796)
@@ -0,0 +1,45 @@
+package org.openstreetmap.josm.io.remotecontrol.handler;
+
+import java.util.LinkedList;
+import java.util.List;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.DownloadPrimitiveAction;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+
+/**
+ * Loads OSM primitives using their ID
+ * similar to the "Download object" dialog (@see DownloadPrimitiveAction}.
+ * For instance, {@code /load_object?objects=n1,w2,r3[&new_layer=false&relation_members=true]}.
+ */
+public class LoadObject extends RequestHandler {
+
+    public static final String command = "load_object";
+
+    public LoadObject() {
+    }
+
+    @Override
+    protected String[] getMandatoryParams() {
+        return new String[]{"objects"};
+    }
+
+    @Override
+    protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException {
+        if (!Main.pref.getBoolean(LoadAndZoomHandler.loadDataPermissionKey, LoadAndZoomHandler.loadDataPermissionDefault)) {
+            System.out.println("RemoteControl: download forbidden by preferences");
+        }
+        List<PrimitiveId> ps = new LinkedList<PrimitiveId>();
+        for (String i : args.get("objects").split(",\\s*")) {
+            ps.add(SimplePrimitiveId.fromString(i));
+        }
+        boolean newLayer = Boolean.parseBoolean(args.get("new_layer"));
+        boolean relationMembers = Boolean.parseBoolean(args.get("relation_members"));
+        DownloadPrimitiveAction.processItems(newLayer, ps, true, relationMembers);
+    }
+
+    @Override
+    public String getPermissionMessage() {
+        return "";
+    }
+}
