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 34381)
+++ applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/DirectDownload.java	(revision 34481)
@@ -5,8 +5,14 @@
 
 import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.HashMap;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.data.gpx.GpxData;
+import org.openstreetmap.josm.data.gpx.GpxTrack;
+import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
+import org.openstreetmap.josm.data.gpx.GpxConstants;
+import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MainMenu;
@@ -17,4 +23,5 @@
 
 public class DirectDownload extends Plugin {
+
     private DownloadAction openaction;
 
@@ -32,5 +39,5 @@
 
     static class DownloadAction extends JosmAction {
-        public DownloadAction() {
+        DownloadAction() {
             super(tr("Download Track ..."), "DownloadAction",
                     tr("Download GPX track from openstreetmap.org"), null, false);
@@ -42,24 +49,44 @@
             go.setVisible(true);
 
-            UserTrack track = go.getSelectedUserTrack();
+            ArrayList<UserTrack> tracks = go.getSelectedUserTracks();
 
-            if (!((go.getValue() == 1) && (track != null))) {
+            if (!((go.getValue() == 1) && (tracks != null))) {
                 return;
             }
 
-            final GpxData data = new GpxServerReader().loadGpx(Long.parseLong(track.id));
-            if (data == null) {
-                return;
-            }
-            final GpxLayer gpxLayer = new GpxLayer(data);
+            for (UserTrack track: tracks) {
 
-            if (data.hasRoutePoints() || data.hasTrackPoints()) {
-                MainApplication.getLayerManager().addLayer(gpxLayer);
-            }
+                GpxData data = new GpxServerReader().loadGpx(Long.parseLong(track.id));
+                if (data == null) {
+                    return;
+                }
 
-            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) {
-                    MainApplication.getLayerManager().addLayer(ml);
+                for (GpxTrack trk : data.getTracks()) {
+                    HashMap<String, Object> attrib = new HashMap<String, Object>(trk.getAttributes());
+                    if (!trk.getAttributes().containsKey(GpxConstants.GPX_NAME)) {
+                        System.out.println(track.filename);
+                        attrib.put(GpxConstants.GPX_NAME, track.filename);
+                    }
+                    if (!trk.getAttributes().containsKey(GpxConstants.GPX_DESC)) {
+                        System.out.println(track.description);
+                        attrib.put(GpxConstants.GPX_DESC, track.description);
+                    }
+                    // replace the existing trace in the unmodifiable tracks
+                    data.removeTrack(trk);
+                    trk = new ImmutableGpxTrack(new ArrayList<GpxTrackSegment>(trk.getSegments()), attrib);
+                    data.addTrack(trk);
+                }
+
+                final GpxLayer gpxLayer = new GpxLayer(data, (track.filename + " " + track.description).trim());
+
+                if (data.hasRoutePoints() || data.hasTrackPoints()) {
+                    MainApplication.getLayerManager().addLayer(gpxLayer);
+                }
+
+                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) {
+                        MainApplication.getLayerManager().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 34381)
+++ applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/DownloadDataGui.java	(revision 34481)
@@ -48,7 +48,7 @@
         tblSearchResults = new JTable(model, columnmodel);
         tblSearchResults.setSelectionModel(selectionModel);
-        tblSearchResults.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+        tblSearchResults.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
         JScrollPane scrollPane = new JScrollPane(tblSearchResults);
-        scrollPane.setPreferredSize(new Dimension(800,300));
+        scrollPane.setPreferredSize(new Dimension(800, 300));
         panel.add(scrollPane, BorderLayout.CENTER);
 
@@ -63,5 +63,5 @@
         private ListSelectionModel selectionModel;
 
-        public NamedResultTableModel(ListSelectionModel selectionModel) {
+        NamedResultTableModel(ListSelectionModel selectionModel) {
             data = new ArrayList<>();
             this.selectionModel = selectionModel;
@@ -84,7 +84,11 @@
                 this.data.clear();
             } else {
-                this.data  =new ArrayList<>(data);
+                this.data = new ArrayList<>(data);
             }
             fireTableDataChanged();
+        }
+
+        public ArrayList<UserTrack> getDataArrayList() {
+            return data;
         }
 
@@ -101,4 +105,14 @@
     }
 
+    public ArrayList<UserTrack> getSelectedUserTracks() {
+        ArrayList<UserTrack> DataArray = model.getDataArrayList();
+        int[] selected = tblSearchResults.getSelectedRows();
+        ArrayList<UserTrack> selectedTracks = new ArrayList<>(selected.length);
+        for (int i = 0; i < selected.length; i++) {
+            selectedTracks.add(DataArray.get(selected[i]));
+        }
+        return selectedTracks;
+    }
+
     public UserTrack getSelectedUserTrack() {
         return model.getSelectedUserTrack();
@@ -135,5 +149,5 @@
 
             // column 3 - tags
-        /*
+
             col = new TableColumn(3);
             col.setHeaderValue(tr("Tags"));
@@ -142,8 +156,8 @@
             col.setCellRenderer(renderer);
             addColumn(col);
-        */
-        }
-
-        public NamedResultTableColumnModel() {
+
+        }
+
+        NamedResultTableColumnModel() {
             createColumns();
         }
@@ -152,7 +166,7 @@
     static class NamedResultCellRenderer extends JLabel implements TableCellRenderer {
 
-        public NamedResultCellRenderer() {
+        NamedResultCellRenderer() {
             setOpaque(true);
-            setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
+            setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
         }
 
@@ -173,5 +187,5 @@
 
         @Override
-		public Component getTableCellRendererComponent(JTable table, Object value,
+        public Component getTableCellRendererComponent(JTable table, Object value,
                 boolean isSelected, boolean hasFocus, int row, int column) {
 
@@ -191,9 +205,9 @@
                 setText(sr.description);
                 break;
-        /*
+
             case 3:
                 setText(sr.tags);
                 break;
-        */
+
             }
             return this;
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 34381)
+++ applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/GpxServerReader.java	(revision 34481)
@@ -1,4 +1,12 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.directdownload;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.Main;
@@ -12,11 +20,4 @@
 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 {
 
@@ -28,5 +29,5 @@
             addAuth(client);
 
-            try (final InputStream in = client.connect().uncompressAccordingToContentDisposition(true).getContent()) {
+            try (InputStream in = client.connect().uncompressAccordingToContentDisposition(true).getContent()) {
                 final GpxReader r = new GpxReader(in);
                 boolean parsedProperly = r.parse(true);
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 34381)
+++ applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/UserTrackReader.java	(revision 34481)
@@ -41,5 +41,5 @@
 
             //parse the file and also register this class for call backs
-            try (final InputStream in = client.connect().getContent()) {
+            try (InputStream in = client.connect().getContent()) {
                 sp.parse(in, handler);
             }
@@ -80,5 +80,5 @@
 
         @Override
-        public void characters(char ch[], int start, int length)
+        public void characters(char[] ch, int start, int length)
                 throws SAXException {
             cdata += new String(ch, start, length);
@@ -89,11 +89,9 @@
             if (qName.equals("description")) {
                 data.getFirst().description = cdata;
+            } else if (qName.equals("tag")) {
+                data.getFirst().tags = cdata;
+                cdata = new String();
             }
-            /*
-            else if (qName.equals("tag")) {
-            data.getFirst().tags = cdata;
-            cdata = new String();
-            }
-            */
+
         }
 
