Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 9085)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 9086)
@@ -172,5 +172,5 @@
      * This sub-object is responsible for all adding and editing of tags
      */
-    private final transient TagEditHelper editHelper = new TagEditHelper(tagData, valueCount);
+    private final transient TagEditHelper editHelper = new TagEditHelper(tagTable, tagData, valueCount);
 
     private final transient DataSetListenerAdapter dataChangedAdapter = new DataSetListenerAdapter(this);
@@ -561,8 +561,8 @@
     }
 
-    private int findRow(TableModel model, Object value) {
+    private int findViewRow(JTable table, TableModel model, Object value) {
         for (int i = 0; i < model.getRowCount(); i++) {
             if (model.getValueAt(i, 0).equals(value))
-                return i;
+                return table.convertRowIndexToView(i);
         }
         return -1;
@@ -639,5 +639,5 @@
         selectedTag = editHelper.getChangedKey(); // select last added or last edited key by default
         if (selectedTag == null && tagTable.getSelectedRowCount() == 1) {
-            selectedTag = (String) tagData.getValueAt(tagTable.getSelectedRow(), 0);
+            selectedTag = editHelper.getDataKey(tagTable.getSelectedRow());
         }
         if (membershipTable.getSelectedRowCount() == 1) {
@@ -737,7 +737,7 @@
 
         int selectedIndex;
-        if (selectedTag != null && (selectedIndex = findRow(tagData, selectedTag)) != -1) {
+        if (selectedTag != null && (selectedIndex = findViewRow(tagTable, tagData, selectedTag)) != -1) {
             tagTable.changeSelection(selectedIndex, 0, false, false);
-        } else if (selectedRelation != null && (selectedIndex = findRow(membershipData, selectedRelation)) != -1) {
+        } else if (selectedRelation != null && (selectedIndex = findViewRow(membershipTable, membershipData, selectedRelation)) != -1) {
             membershipTable.changeSelection(selectedIndex, 0, false, false);
         } else if (hasTags) {
@@ -791,11 +791,10 @@
      * @return The current selected tag
      */
-    @SuppressWarnings("unchecked")
     public Tag getSelectedProperty() {
         int row = tagTable.getSelectedRow();
         if (row == -1) return null;
-        Map<String, Integer> map = (TreeMap<String, Integer>) tagData.getValueAt(row, 1);
+        Map<String, Integer> map = editHelper.getDataValues(row);
         return new Tag(
-                tagData.getValueAt(row, 0).toString(),
+                editHelper.getDataKey(row),
                 map.size() > 1 ? "" : map.keySet().iterator().next());
     }
@@ -952,5 +951,5 @@
             int nextKeyIndex = rows[0];
             for (int row : rows) {
-                String key = tagData.getValueAt(row, 0).toString();
+                String key = editHelper.getDataKey(row);
                 if (row == nextKeyIndex + 1) {
                     nextKeyIndex = row; // no gap yet
@@ -970,5 +969,5 @@
                     nextKeyIndex++;
                 }
-                nextKey = (String) tagData.getValueAt(nextKeyIndex, 0);
+                nextKey = editHelper.getDataKey(nextKeyIndex);
             }
 
@@ -978,5 +977,5 @@
             membershipTable.clearSelection();
             if (nextKey != null) {
-                tagTable.changeSelection(findRow(tagData, nextKey), 0, false, false);
+                tagTable.changeSelection(findViewRow(tagTable, tagData, nextKey), 0, false, false);
             }
         }
@@ -1010,5 +1009,5 @@
             tagTable.clearSelection();
             if (nextRelation != null) {
-                membershipTable.changeSelection(findRow(membershipData, nextRelation), 0, false, false);
+                membershipTable.changeSelection(findViewRow(membershipTable, membershipData, nextRelation), 0, false, false);
             }
         }
@@ -1115,7 +1114,6 @@
                 if (tagTable.getSelectedRowCount() == 1) {
                     row = tagTable.getSelectedRow();
-                    String key = Utils.encodeUrl(tagData.getValueAt(row, 0).toString());
-                    @SuppressWarnings("unchecked")
-                    Map<String, Integer> m = (Map<String, Integer>) tagData.getValueAt(row, 1);
+                    String key = Utils.encodeUrl(editHelper.getDataKey(row));
+                    Map<String, Integer> m = editHelper.getDataValues(row);
                     String val = Utils.encodeUrl(m.entrySet().iterator().next().getKey());
 
@@ -1206,11 +1204,10 @@
 
         @Override
-        @SuppressWarnings("unchecked")
         public void actionPerformed(ActionEvent e) {
             final String url;
             if (tagTable.getSelectedRowCount() == 1) {
                 final int row = tagTable.getSelectedRow();
-                final String key = Utils.encodeUrl(tagData.getValueAt(row, 0).toString());
-                Map<String, Integer> values = (Map<String, Integer>) tagData.getValueAt(row, 1);
+                final String key = Utils.encodeUrl(editHelper.getDataKey(row));
+                Map<String, Integer> values = editHelper.getDataValues(row);
                 if (values.size() == 1) {
                     url = TAGINFO_URL_PROP.get() + "tags/" + key /* do not URL encode key, otherwise addr:street does not work */
@@ -1239,5 +1236,5 @@
             if (tagTable.getSelectedRowCount() != 1)
                 return;
-            String key = tagData.getValueAt(tagTable.getSelectedRow(), 0).toString();
+            String key = editHelper.getDataKey(tagTable.getSelectedRow());
             Collection<OsmPrimitive> sel = Main.main.getInProgressSelection();
             String clipboard = Utils.getClipboardContent();
@@ -1260,5 +1257,5 @@
 
             for (int row: rows) {
-                String key = tagData.getValueAt(row, 0).toString();
+                String key = editHelper.getDataKey(row);
                 if (sel.isEmpty())
                     return;
@@ -1342,5 +1339,5 @@
             if (tagTable.getSelectedRowCount() != 1)
                 return;
-            String key = tagData.getValueAt(tagTable.getSelectedRow(), 0).toString();
+            String key = editHelper.getDataKey(tagTable.getSelectedRow());
             Collection<OsmPrimitive> sel = Main.main.getInProgressSelection();
             if (sel.isEmpty())
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 9085)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 9086)
@@ -53,4 +53,5 @@
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
+import javax.swing.JTable;
 import javax.swing.KeyStroke;
 import javax.swing.ListCellRenderer;
@@ -86,4 +87,5 @@
  */
 class TagEditHelper {
+    private final JTable tagTable;
     private final DefaultTableModel tagData;
     private final Map<String, Map<String, Integer>> valueCount;
@@ -116,7 +118,17 @@
     };
 
-    TagEditHelper(DefaultTableModel propertyData, Map<String, Map<String, Integer>> valueCount) {
+    TagEditHelper(JTable tagTable, DefaultTableModel propertyData, Map<String, Map<String, Integer>> valueCount) {
+        this.tagTable = tagTable;
         this.tagData = propertyData;
         this.valueCount = valueCount;
+    }
+
+    public final String getDataKey(int viewRow) {
+        return tagData.getValueAt(tagTable.convertRowIndexToModel(viewRow), 0).toString();
+    }
+
+    @SuppressWarnings("unchecked")
+    public final Map<String, Integer> getDataValues(int viewRow) {
+        return (Map<String, Integer>) tagData.getValueAt(tagTable.convertRowIndexToModel(viewRow), 1);
     }
 
@@ -152,10 +164,8 @@
         if (sel == null || sel.isEmpty()) return;
 
-        String key = tagData.getValueAt(row, 0).toString();
+        String key = getDataKey(row);
         objKey = key;
 
-        @SuppressWarnings("unchecked")
-        final EditTagDialog editDialog = new EditTagDialog(key,
-                (Map<String, Integer>) tagData.getValueAt(row, 1), focusOnKey);
+        final EditTagDialog editDialog = new EditTagDialog(key, getDataValues(row), focusOnKey);
         editDialog.showDialog();
         if (editDialog.getValue() != 1) return;
@@ -567,5 +577,5 @@
                 }
                 for (int i = 0; i < tagData.getRowCount(); ++i) {
-                    if (item.getValue().equals(tagData.getValueAt(i, 0))) {
+                    if (item.getValue().equals(getDataKey(i))) {
                         if (itemToSelect == item) {
                             itemToSelect = null;
@@ -831,5 +841,5 @@
             // performing this action leads to autocomplete to the next key (see #7671 comments)
             for (int j = 0; j < tagData.getRowCount(); ++j) {
-                if (t.getKey().equals(tagData.getValueAt(j, 0))) {
+                if (t.getKey().equals(getDataKey(j))) {
                     action.setEnabled(false);
                     break;
