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 35981)
+++ applications/editors/josm/plugins/DirectDownload/src/org/openstreetmap/josm/plugins/directdownload/DownloadDataGui.java	(revision 35982)
@@ -5,21 +5,14 @@
 
 import java.awt.BorderLayout;
-import java.awt.Component;
 import java.awt.Dimension;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.swing.BorderFactory;
 import javax.swing.DefaultListSelectionModel;
-import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
-import javax.swing.UIManager;
-import javax.swing.table.DefaultTableColumnModel;
 import javax.swing.table.DefaultTableModel;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.table.TableColumn;
 
 import org.openstreetmap.josm.gui.ExtendedDialog;
@@ -28,7 +21,6 @@
 public class DownloadDataGui extends ExtendedDialog {
 
-    private NamedResultTableModel model;
-    private NamedResultTableColumnModel columnmodel;
-    private JTable tblSearchResults;
+    private final NamedResultTableModel model;
+    private final JTable tblSearchResults;
 
     public DownloadDataGui() {
@@ -44,7 +36,7 @@
 
         DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
-        model = new NamedResultTableModel(selectionModel);
-        columnmodel = new NamedResultTableColumnModel();
-        tblSearchResults = new JTable(model, columnmodel);
+        model = new NamedResultTableModel();
+        tblSearchResults = new JTable(model);
+        tblSearchResults.setAutoCreateRowSorter(true);
         tblSearchResults.setSelectionModel(selectionModel);
         tblSearchResults.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
@@ -53,17 +45,15 @@
         panel.add(scrollPane, BorderLayout.CENTER);
 
-    model.setData(new UserTrackReader().getTrackList());
+        model.setData(new UserTrackReader().getTrackList());
 
-    setContent(panel);
-    setupDialog();
+        setContent(panel);
+        setupDialog();
     }
 
     static class NamedResultTableModel extends DefaultTableModel {
         private ArrayList<UserTrack> data;
-        private ListSelectionModel selectionModel;
 
-        NamedResultTableModel(ListSelectionModel selectionModel) {
+        NamedResultTableModel() {
             data = new ArrayList<>();
-            this.selectionModel = selectionModel;
         }
 
@@ -77,5 +67,17 @@
         public Object getValueAt(int row, int column) {
             if (data == null) return null;
-            return data.get(row);
+            UserTrack track =  data.get(row);
+            switch (column) {
+            case 0:
+                return track.datetime;
+            case 1:
+                return track.filename;
+            case 2:
+                return track.description;
+            case 3:
+                return String.join(";", track.tags);
+            default:
+                return track;
+            }
         }
 
@@ -89,5 +91,5 @@
         }
 
-        public ArrayList<UserTrack> getDataArrayList() {
+        public List<UserTrack> getDataArrayList() {
             return data;
         }
@@ -98,8 +100,36 @@
         }
 
-        public UserTrack getSelectedUserTrack() {
-            if (selectionModel.getMinSelectionIndex() < 0)
-                return null;
-            return data.get(selectionModel.getMinSelectionIndex());
+        @Override
+        public int getColumnCount() {
+            return 4;
+        }
+
+        @Override
+        public String getColumnName(int column) {
+            switch (column) {
+            case 0:
+                return tr("Date");
+            case 1:
+                return tr("Filename");
+            case 2:
+                return tr("Description");
+            case 3:
+                return tr("Tags");
+            default:
+                throw new IllegalArgumentException("Unknown column");
+            }
+        }
+
+        @Override
+        public Class<?> getColumnClass(int columnIndex) {
+            switch (columnIndex) {
+            case 0:
+            case 1:
+            case 2:
+            case 3:
+                return String.class;
+            default:
+                throw new IllegalArgumentException("Unknown column");
+            }
         }
     }
@@ -111,5 +141,5 @@
 
         for (int i : selected) {
-            selectedTracks.add(dataArray.get(i));
+            selectedTracks.add(dataArray.get(tblSearchResults.convertRowIndexToModel(i)));
         }
 
@@ -118,101 +148,5 @@
 
     public UserTrack getSelectedUserTrack() {
-        return model.getSelectedUserTrack();
-    }
-
-    static class NamedResultTableColumnModel extends DefaultTableColumnModel {
-        protected void createColumns() {
-            TableColumn col;
-            NamedResultCellRenderer renderer = new NamedResultCellRenderer();
-
-            // column 0 - DateTime
-            col = new TableColumn(0);
-            col.setHeaderValue(tr("Date"));
-            col.setResizable(true);
-            col.setPreferredWidth(150);
-            col.setCellRenderer(renderer);
-            addColumn(col);
-
-            // column 1 - Filename
-            col = new TableColumn(1);
-            col.setHeaderValue(tr("Filename"));
-            col.setResizable(true);
-            col.setPreferredWidth(200);
-            col.setCellRenderer(renderer);
-            addColumn(col);
-
-            // column 2 - Description
-            col = new TableColumn(2);
-            col.setHeaderValue(tr("Description"));
-            col.setResizable(true);
-            col.setPreferredWidth(450);
-            col.setCellRenderer(renderer);
-            addColumn(col);
-
-            // column 3 - tags
-
-            col = new TableColumn(3);
-            col.setHeaderValue(tr("Tags"));
-            col.setResizable(true);
-            col.setPreferredWidth(100);
-            col.setCellRenderer(renderer);
-            addColumn(col);
-
-        }
-
-        NamedResultTableColumnModel() {
-            createColumns();
-        }
-    }
-
-    static class NamedResultCellRenderer extends JLabel implements TableCellRenderer {
-
-        NamedResultCellRenderer() {
-            setOpaque(true);
-            setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
-        }
-
-        protected void reset() {
-            setText("");
-            setIcon(null);
-        }
-
-        protected void renderColor(boolean selected) {
-            if (selected) {
-                setForeground(UIManager.getColor("Table.selectionForeground"));
-                setBackground(UIManager.getColor("Table.selectionBackground"));
-            } else {
-                setForeground(UIManager.getColor("Table.foreground"));
-                setBackground(UIManager.getColor("Table.background"));
-            }
-        }
-
-        @Override
-        public Component getTableCellRendererComponent(JTable table, Object value,
-                boolean isSelected, boolean hasFocus, int row, int column) {
-
-            reset();
-            renderColor(isSelected);
-
-            if (value == null) return this;
-            UserTrack sr = (UserTrack) value;
-            switch(column) {
-            case 0:
-                setText(sr.datetime);
-                break;
-            case 1:
-                setText(sr.filename);
-                break;
-            case 2:
-                setText(sr.description);
-                break;
-
-            case 3:
-                setText(String.join(";", sr.tags));
-                break;
-
-            }
-            return this;
-        }
+        return model.getDataArrayList().get(tblSearchResults.convertRowIndexToModel(tblSearchResults.getSelectedRow()));
     }
 }
