Index: src/org/openstreetmap/josm/actions/OpenAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/OpenAction.java	(revision 209)
+++ src/org/openstreetmap/josm/actions/OpenAction.java	(revision 210)
@@ -62,5 +62,5 @@
 				Collection<Marker> markerData = null;
 				if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn)) {
-					RawGpsReader r = new RawGpsReader(new FileInputStream(file));
+					RawGpsReader r = new RawGpsReader(new FileInputStream(file), file.getAbsoluteFile().getParentFile());
 					gpsData = r.trackData;
 					markerData = r.markerData;
Index: src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java	(revision 209)
+++ src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java	(revision 210)
@@ -5,4 +5,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.io.File;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -16,4 +17,6 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.tools.ImageProvider;
+
+import com.sun.org.apache.xerces.internal.util.URI;
 
 /**
@@ -68,6 +71,11 @@
 	static {
 		Marker.markerProducers.add(new MarkerProducers() {
-			public Marker createMarker(LatLon ll, Map<String,String> data) {
+			public Marker createMarker(LatLon ll, Map<String,String> data, File relativePath) {
 				String link = data.get("link");
+
+				// Try a relative file:// url, if the link is not in an URL-compatible form
+				if (relativePath != null && !URI.isWellFormedAddress(link))
+					link = new File(relativePath, link).toURI().toString();
+
 				if (link == null)
 					return new Marker(ll, data.get("name"), data.get("symbol"));
@@ -138,9 +146,11 @@
 	 * @param ll lat/lon for marker
 	 * @param data hash containing keys and values from the GPX waypoint structure
+	 * @param relativePath An path to use for constructing relative URLs or 
+	 *        <code>null</code> for no relative URLs
 	 * @return a new Marker object
 	 */
-	public static Marker createMarker(LatLon ll, HashMap<String,String> data) {
+	public static Marker createMarker(LatLon ll, HashMap<String,String> data, File relativePath) {
 		for (MarkerProducers maker : Marker.markerProducers) {
-			Marker marker = maker.createMarker(ll, data);
+			Marker marker = maker.createMarker(ll, data, relativePath);
 			if (marker != null)
 				return marker;
Index: src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerProducers.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerProducers.java	(revision 209)
+++ src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerProducers.java	(revision 210)
@@ -1,4 +1,5 @@
 package org.openstreetmap.josm.gui.layer.markerlayer;
 
+import java.io.File;
 import java.util.Map;
 
@@ -20,6 +21,8 @@
 	 * @param ll lat/lon for the marker position
 	 * @param data A map of all tags found in the <wpt> node of the gpx file. 
+	 * @param relativePath An path to use for constructing relative URLs or 
+	 *        <code>null</code> for no relative URLs
 	 * @return A Marker object, or <code>null</code>.
 	 */
-	public Marker createMarker(LatLon ll, Map<String,String> data);
+	public Marker createMarker(LatLon ll, Map<String,String> data, File relativePath);
 }
Index: src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
===================================================================
--- src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 209)
+++ src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 210)
@@ -49,5 +49,5 @@
     				break;
     			// Use only track points, since the server mix everything together 
-    			Collection<Collection<GpsPoint>> allWays = new RawGpsReader(in).trackData;
+    			Collection<Collection<GpsPoint>> allWays = new RawGpsReader(in, null).trackData;
 
     			boolean foundSomething = false;
@@ -70,5 +70,5 @@
     		if (cancel)
     			return null;
-    		throw e;
+    		throw new SAXException("Illegal characters within the HTTP-header response", e);
     	} catch (IOException e) {
     		if (cancel)
Index: src/org/openstreetmap/josm/io/RawGpsReader.java
===================================================================
--- src/org/openstreetmap/josm/io/RawGpsReader.java	(revision 209)
+++ src/org/openstreetmap/josm/io/RawGpsReader.java	(revision 210)
@@ -3,4 +3,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -15,4 +16,5 @@
 import org.openstreetmap.josm.gui.layer.RawGpsLayer.GpsPoint;
 import org.openstreetmap.josm.gui.layer.markerlayer.Marker;
+import org.openstreetmap.josm.gui.layer.markerlayer.MarkerProducers;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -26,4 +28,10 @@
  */
 public class RawGpsReader {
+
+	/**
+	 * The relative path when constructing markers from wpt-tags. Passed to 
+	 * {@link MarkerProducers#createMarker(LatLon, java.util.Map, String)}
+	 */
+	private File relativeMarkerPath;
 
 	/**
@@ -90,5 +98,5 @@
 				currentTagValues.clear();
 			} else if (qName.equals("wpt")) {
-				markerData.add(Marker.createMarker(currentLatLon, currentTagValues));
+				markerData.add(Marker.createMarker(currentLatLon, currentTagValues, relativeMarkerPath));
 				currentTagValues.clear();
 			} else if (qName.equals("trkseg") || qName.equals("trk") || qName.equals("gpx")) {
@@ -107,9 +115,12 @@
 	}
 
-
 	/**
-	 * Parse the input stream and store the result in trackData and markerData 
+	 * Parse the input stream and store the result in trackData and markerData
+	 * 
+	 * @param relativeMarkerPath The directory to use as relative path for all &lt;wpt&gt; 
+	 *    marker tags. Maybe <code>null</code>, in which case no relative urls are constructed for the markers. 
 	 */
-	public RawGpsReader(InputStream source) throws SAXException, IOException {
+	public RawGpsReader(InputStream source, File relativeMarkerPath) throws SAXException, IOException {
+		this.relativeMarkerPath = relativeMarkerPath;
 		Parser parser = new Parser();
 		parser.parse(new InputStreamReader(source, "UTF-8"));
