Index: /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/DirectDownload.java
===================================================================
--- /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/DirectDownload.java	(revision 31933)
+++ /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/DirectDownload.java	(revision 31934)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
@@ -27,5 +28,5 @@
      * Will be invoked by JOSM to bootstrap the plugin
      *
-     * @param info  information about the plugin and its local installation    
+     * @param info  information about the plugin and its local installation
      */
     public DirectDownload(PluginInformation info) {
@@ -48,41 +49,22 @@
             UserTrack track = go.getSelectedUserTrack();
 
-            if ((go.getValue() == 1) && (track != null)) {
-                String urlString = OsmApi.getOsmApi().getBaseUrl() + "gpx/" + track.id + "/data";
+            if (!((go.getValue() == 1) && (track != null))) {
+                return;
+            }
 
-                try {
-                    URL trackDataUrl = new URL(urlString);
-                    InputStream is = Utils.openURLAndDecompress(trackDataUrl, true);
+            final GpxData data = new GpxServerReader().loadGpx(Long.parseLong(track.id));
+            if (data == null) {
+                return;
+            }
+            final GpxLayer gpxLayer = new GpxLayer(data);
 
-                    GpxReader r = new GpxReader(is);
-                    boolean parsedProperly = r.parse(true);
-                    GpxLayer gpxLayer = new GpxLayer(r.getGpxData(), track.filename, true);
+            if (data.hasRoutePoints() || data.hasTrackPoints()) {
+                Main.main.addLayer(gpxLayer);
+            }
 
-                    if (r.getGpxData().hasRoutePoints() || r.getGpxData().hasTrackPoints()) {
-                        Main.main.addLayer(gpxLayer);
-                    }
-
-                    if (Main.pref.getBoolean("marker.makeautomarkers", true) && !r.getGpxData().waypoints.isEmpty()) {
-                        MarkerLayer ml = new MarkerLayer(r.getGpxData(), tr("Markers from {0}", track.filename), null, gpxLayer);
-                        if (ml.data.size() > 0) {
-                            Main.main.addLayer(ml);
-                        }
-                    }
-                    if (!parsedProperly) {
-                        JOptionPane.showMessageDialog(Main.parent,
-                            tr("Error occurred while parsing gpx file {0}. Only a part of the file will be available.", urlString));
-                    }
-
-                } catch (java.net.MalformedURLException e) {
-                    JOptionPane.showMessageDialog(Main.parent,
-                            tr("Invalid URL {0}", urlString));
-                } catch (java.io.IOException e) {
-                    e.printStackTrace();
-                    JOptionPane.showMessageDialog(Main.parent,
-                            tr("Error fetching URL {0}", urlString));
-                } catch (SAXException e) {
-                    e.printStackTrace();
-                    JOptionPane.showMessageDialog(Main.parent,
-                            tr("Error parsing data from URL {0}", urlString));
+            if (Main.pref.getBoolean("marker.makeautomarkers", true) && !data.waypoints.isEmpty()) {
+                MarkerLayer ml = new MarkerLayer(data, tr("Markers from {0}", track.filename), null, gpxLayer);
+                if (ml.data.size() > 0) {
+                    Main.main.addLayer(ml);
                 }
             }
Index: /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/DownloadDataGui.java
===================================================================
--- /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/DownloadDataGui.java	(revision 31933)
+++ /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/DownloadDataGui.java	(revision 31934)
@@ -64,84 +64,8 @@
         panel.add(scrollPane, BorderLayout.CENTER);
 
-    model.setData(getTrackList());
+    model.setData(new UserTrackReader().getTrackList());
 
     setContent(panel);
     setupDialog();
-    }
-
-    private static class TrackListHandler extends DefaultHandler {
-        private LinkedList<UserTrack> data = new LinkedList<>();
-
-        private String cdata = new String();
-
-        @Override
-        public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
-            if (qName.equals("gpx_file")) {
-            UserTrack track = new UserTrack();
-
-            track.id       = atts.getValue("id");
-            track.filename = atts.getValue("name");
-            track.datetime = atts.getValue("timestamp").replaceAll("[TZ]", " "); // TODO: do real parsing and time zone conversion
-
-            data.addFirst(track);
-            }
-            cdata = new String();
-        }
-
-        @Override
-		public void characters(char ch[], int start, int length)
-            throws SAXException {
-            cdata += new String(ch, start, length);
-        }
-
-        @Override
-		public void endElement(String uri, String localName, String qName) throws SAXException {
-            if (qName.equals("description")) {
-            data.getFirst().description = cdata;
-            }
-            /*
-            else if (qName.equals("tag")) {
-            data.getFirst().tags = cdata;
-            cdata = new String();
-            }
-            */
-        }
-
-        public List<UserTrack> getResult() {
-            return data;
-        }
-    }
-
-    private List<UserTrack> getTrackList() {
-        String urlString = OsmApi.getOsmApi().getBaseUrl() + "user/gpx_files";
-
-        try {
-            URL userTracksUrl = new URL(urlString);
-
-            SAXParserFactory spf = SAXParserFactory.newInstance();
-            TrackListHandler handler = new TrackListHandler();
-
-            //get a new instance of parser
-            SAXParser sp = spf.newSAXParser();
-
-            //parse the file and also register this class for call backs
-            sp.parse(userTracksUrl.openStream(), handler);
-
-            return handler.getResult();
-        } catch (java.net.MalformedURLException e) {
-            Main.error(e);
-            JOptionPane.showMessageDialog(null, tr("Invalid URL {0}", urlString));
-        } catch (java.io.IOException e) {
-            Main.error(e);
-            JOptionPane.showMessageDialog(null, tr("Error fetching URL {0}", urlString));
-        } catch (SAXException e) {
-            Main.error(e);
-            JOptionPane.showMessageDialog(null, tr("Error parsing data from URL {0}", urlString));
-        } catch (ParserConfigurationException e) {
-            Main.error(e);
-            JOptionPane.showMessageDialog(null, tr("Error parsing data from URL {0}", urlString));
-        }
-
-        return new LinkedList<>();
     }
 
Index: /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/GpxServerReader.java
===================================================================
--- /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/GpxServerReader.java	(revision 31934)
+++ /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/GpxServerReader.java	(revision 31934)
@@ -0,0 +1,49 @@
+package org.openstreetmap.josm.plugins.directdownload;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.gpx.GpxData;
+import org.openstreetmap.josm.io.GpxReader;
+import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.io.OsmConnection;
+import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.tools.HttpClient;
+import org.xml.sax.SAXException;
+
+import javax.swing.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+public class GpxServerReader extends OsmConnection {
+
+    public GpxData loadGpx(final long id) {
+        final String urlString = OsmApi.getOsmApi().getBaseUrl() + "gpx/" + id + "/data";
+
+        try {
+            final HttpClient client = HttpClient.create(new URL(urlString));
+            addAuth(client);
+
+            try (final InputStream in = client.connect().uncompressAccordingToContentDisposition(true).getContent()) {
+                final GpxReader r = new GpxReader(in);
+                boolean parsedProperly = r.parse(true);
+                if (!parsedProperly) {
+                    JOptionPane.showMessageDialog(Main.parent,
+                            tr("Error occurred while parsing gpx file {0}. Only a part of the file will be available.", urlString));
+                }
+                return r.getGpxData();
+            }
+        } catch (IOException | OsmTransferException e) {
+            Main.warn(e);
+            JOptionPane.showMessageDialog(Main.parent, tr("Error fetching URL {0}", urlString));
+            return null;
+        } catch (SAXException e) {
+            Main.warn(e);
+            JOptionPane.showMessageDialog(Main.parent, tr("Error parsing data from URL {0}", urlString));
+            return null;
+
+        }
+    }
+
+}
Index: /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/UserTrackReader.java
===================================================================
--- /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/UserTrackReader.java	(revision 31934)
+++ /applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/UserTrackReader.java	(revision 31934)
@@ -0,0 +1,101 @@
+package org.openstreetmap.josm.plugins.directdownload;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.io.OsmConnection;
+import org.openstreetmap.josm.io.OsmTransferException;
+import org.openstreetmap.josm.tools.HttpClient;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import javax.swing.*;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.LinkedList;
+import java.util.List;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+public class UserTrackReader extends OsmConnection {
+
+    public List<UserTrack> getTrackList() {
+        final String urlString = OsmApi.getOsmApi().getBaseUrl() + "user/gpx_files";
+
+        try {
+            final HttpClient client = HttpClient.create(new URL(urlString));
+            addAuth(client);
+
+            SAXParserFactory spf = SAXParserFactory.newInstance();
+            TrackListHandler handler = new TrackListHandler();
+
+            //get a new instance of parser
+            SAXParser sp = spf.newSAXParser();
+
+            //parse the file and also register this class for call backs
+            try (final InputStream in = client.connect().getContent()) {
+                sp.parse(in, handler);
+            }
+
+            return handler.getResult();
+        } catch (java.net.MalformedURLException e) {
+            Main.error(e);
+            JOptionPane.showMessageDialog(null, tr("Invalid URL {0}", urlString));
+        } catch (java.io.IOException | OsmTransferException e) {
+            Main.error(e);
+            JOptionPane.showMessageDialog(null, tr("Error fetching URL {0}", urlString));
+        } catch (SAXException | ParserConfigurationException e) {
+            Main.error(e);
+            JOptionPane.showMessageDialog(null, tr("Error parsing data from URL {0}", urlString));
+        }
+
+        return new LinkedList<>();
+    }
+
+    private static class TrackListHandler extends DefaultHandler {
+        private LinkedList<UserTrack> data = new LinkedList<>();
+
+        private String cdata = "";
+
+        @Override
+        public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
+            if (qName.equals("gpx_file")) {
+                UserTrack track = new UserTrack();
+
+                track.id = atts.getValue("id");
+                track.filename = atts.getValue("name");
+                track.datetime = atts.getValue("timestamp").replaceAll("[TZ]", " "); // TODO: do real parsing and time zone conversion
+
+                data.addFirst(track);
+            }
+            cdata = "";
+        }
+
+        @Override
+        public void characters(char ch[], int start, int length)
+                throws SAXException {
+            cdata += new String(ch, start, length);
+        }
+
+        @Override
+        public void endElement(String uri, String localName, String qName) throws SAXException {
+            if (qName.equals("description")) {
+                data.getFirst().description = cdata;
+            }
+            /*
+            else if (qName.equals("tag")) {
+            data.getFirst().tags = cdata;
+            cdata = new String();
+            }
+            */
+        }
+
+        public List<UserTrack> getResult() {
+            return data;
+        }
+    }
+
+}
