Index: trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java	(revision 11366)
@@ -12,4 +12,5 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -185,6 +186,6 @@
      */
     public static class RelationMemberTableModel extends DefaultTableModel {
-        private static class RelationToChildReferenceComparator implements Comparator<RelationToChildReference> {
-            private NameFormatter nf = DefaultNameFormatter.getInstance();
+        private static class RelationToChildReferenceComparator implements Comparator<RelationToChildReference>, Serializable {
+            private final NameFormatter nf = DefaultNameFormatter.getInstance();
 
             @Override
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 11366)
@@ -25,4 +25,5 @@
 import javax.swing.table.JTableHeader;
 import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumnModel;
 import javax.swing.table.TableModel;
 
@@ -243,4 +244,17 @@
 
     static final class UserTable extends JTable {
+        static final class UserTableHeader extends JTableHeader {
+            UserTableHeader(TableColumnModel cm) {
+                super(cm);
+            }
+
+            @Override
+            public String getToolTipText(MouseEvent e) {
+                int index = columnModel.getColumnIndexAtX(e.getPoint().x);
+                int realIndex = columnModel.getColumn(index).getModelIndex();
+                return COLUMN_TOOLTIPS[realIndex];
+            }
+        }
+
         UserTable(TableModel dm) {
             super(dm);
@@ -249,12 +263,5 @@
         @Override
         protected JTableHeader createDefaultTableHeader() {
-            return new JTableHeader(columnModel) {
-                @Override
-                public String getToolTipText(MouseEvent e) {
-                    int index = columnModel.getColumnIndexAtX(e.getPoint().x);
-                    int realIndex = columnModel.getColumn(index).getModelIndex();
-                    return COLUMN_TOOLTIPS[realIndex];
-                }
-            };
+            return new UserTableHeader(columnModel);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 11366)
@@ -326,55 +326,7 @@
         TableColumnModel mod = membershipTable.getColumnModel();
         membershipTable.getTableHeader().setReorderingAllowed(false);
-        mod.getColumn(0).setCellRenderer(new DefaultTableCellRenderer() {
-            @Override public Component getTableCellRendererComponent(JTable table, Object value,
-                    boolean isSelected, boolean hasFocus, int row, int column) {
-                Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
-                if (value == null)
-                    return this;
-                if (c instanceof JLabel) {
-                    JLabel label = (JLabel) c;
-                    Relation r = (Relation) value;
-                    label.setText(r.getDisplayName(DefaultNameFormatter.getInstance()));
-                    if (r.isDisabledAndHidden()) {
-                        label.setFont(label.getFont().deriveFont(Font.ITALIC));
-                    }
-                }
-                return c;
-            }
-        });
-
-        mod.getColumn(1).setCellRenderer(new DefaultTableCellRenderer() {
-            @Override public Component getTableCellRendererComponent(JTable table, Object value,
-                    boolean isSelected, boolean hasFocus, int row, int column) {
-                if (value == null)
-                    return this;
-                Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
-                boolean isDisabledAndHidden = ((Relation) table.getValueAt(row, 0)).isDisabledAndHidden();
-                if (c instanceof JLabel) {
-                    JLabel label = (JLabel) c;
-                    label.setText(((MemberInfo) value).getRoleString());
-                    if (isDisabledAndHidden) {
-                        label.setFont(label.getFont().deriveFont(Font.ITALIC));
-                    }
-                }
-                return c;
-            }
-        });
-
-        mod.getColumn(2).setCellRenderer(new DefaultTableCellRenderer() {
-            @Override public Component getTableCellRendererComponent(JTable table, Object value,
-                    boolean isSelected, boolean hasFocus, int row, int column) {
-                Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
-                boolean isDisabledAndHidden = ((Relation) table.getValueAt(row, 0)).isDisabledAndHidden();
-                if (c instanceof JLabel) {
-                    JLabel label = (JLabel) c;
-                    label.setText(((MemberInfo) table.getValueAt(row, 1)).getPositionString());
-                    if (isDisabledAndHidden) {
-                        label.setFont(label.getFont().deriveFont(Font.ITALIC));
-                    }
-                }
-                return c;
-            }
-        });
+        mod.getColumn(0).setCellRenderer(new MemberOfCellRenderer());
+        mod.getColumn(1).setCellRenderer(new RoleCellRenderer());
+        mod.getColumn(2).setCellRenderer(new PositionCellRenderer());
         mod.getColumn(2).setPreferredWidth(20);
         mod.getColumn(1).setPreferredWidth(40);
@@ -388,13 +340,5 @@
         if (Main.pref.getBoolean("properties.menu.add_edit_delete", true)) {
             blankSpaceMenuHandler.addAction(addAction);
-            PopupMenuLauncher launcher = new PopupMenuLauncher(blankSpaceMenu) {
-                @Override
-                protected boolean checkSelection(Component component, Point p) {
-                    if (component instanceof JTable) {
-                        return ((JTable) component).rowAtPoint(p) == -1;
-                    }
-                    return true;
-                }
-            };
+            PopupMenuLauncher launcher = new BlankSpaceMenuLauncher(blankSpaceMenu);
             bothTables.addMouseListener(launcher);
             tagTable.addMouseListener(launcher);
@@ -818,4 +762,73 @@
     }
 
+    static final class MemberOfCellRenderer extends DefaultTableCellRenderer {
+        @Override
+        public Component getTableCellRendererComponent(JTable table, Object value,
+                boolean isSelected, boolean hasFocus, int row, int column) {
+            Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
+            if (value == null)
+                return this;
+            if (c instanceof JLabel) {
+                JLabel label = (JLabel) c;
+                Relation r = (Relation) value;
+                label.setText(r.getDisplayName(DefaultNameFormatter.getInstance()));
+                if (r.isDisabledAndHidden()) {
+                    label.setFont(label.getFont().deriveFont(Font.ITALIC));
+                }
+            }
+            return c;
+        }
+    }
+
+    static final class RoleCellRenderer extends DefaultTableCellRenderer {
+        @Override
+        public Component getTableCellRendererComponent(JTable table, Object value,
+                boolean isSelected, boolean hasFocus, int row, int column) {
+            if (value == null)
+                return this;
+            Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
+            boolean isDisabledAndHidden = ((Relation) table.getValueAt(row, 0)).isDisabledAndHidden();
+            if (c instanceof JLabel) {
+                JLabel label = (JLabel) c;
+                label.setText(((MemberInfo) value).getRoleString());
+                if (isDisabledAndHidden) {
+                    label.setFont(label.getFont().deriveFont(Font.ITALIC));
+                }
+            }
+            return c;
+        }
+    }
+
+    static final class PositionCellRenderer extends DefaultTableCellRenderer {
+        @Override
+        public Component getTableCellRendererComponent(JTable table, Object value,
+                boolean isSelected, boolean hasFocus, int row, int column) {
+            Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
+            boolean isDisabledAndHidden = ((Relation) table.getValueAt(row, 0)).isDisabledAndHidden();
+            if (c instanceof JLabel) {
+                JLabel label = (JLabel) c;
+                label.setText(((MemberInfo) table.getValueAt(row, 1)).getPositionString());
+                if (isDisabledAndHidden) {
+                    label.setFont(label.getFont().deriveFont(Font.ITALIC));
+                }
+            }
+            return c;
+        }
+    }
+
+    static final class BlankSpaceMenuLauncher extends PopupMenuLauncher {
+        BlankSpaceMenuLauncher(JPopupMenu menu) {
+            super(menu);
+        }
+
+        @Override
+        protected boolean checkSelection(Component component, Point p) {
+            if (component instanceof JTable) {
+                return ((JTable) component).rowAtPoint(p) == -1;
+            }
+            return true;
+        }
+    }
+
     static final class TaggingPresetCommandHandler implements TaggingPresetHandler {
         @Override
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollection.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollection.java	(revision 11366)
@@ -15,15 +15,26 @@
 class RecentTagCollection {
 
+    /**
+     * LRU cache for recently added tags (http://java-planet.blogspot.com/2005/08/how-to-set-up-simple-lru-cache-using.html)
+     */
+    static final class LruCache extends LinkedHashMap<Tag, Void> {
+        private final int capacity;
+
+        LruCache(int capacity) {
+            super(capacity + 1, 1.1f, true);
+            this.capacity = capacity;
+        }
+
+        @Override
+        protected boolean removeEldestEntry(Map.Entry<Tag, Void> eldest) {
+            return size() > capacity;
+        }
+    }
+
     private final Map<Tag, Void> recentTags;
     private SearchCompiler.Match tagsToIgnore;
 
     RecentTagCollection(final int capacity) {
-        // LRU cache for recently added tags (http://java-planet.blogspot.com/2005/08/how-to-set-up-simple-lru-cache-using.html)
-        recentTags = new LinkedHashMap<Tag, Void>(capacity + 1, 1.1f, true) {
-            @Override
-            protected boolean removeEldestEntry(Map.Entry<Tag, Void> eldest) {
-                return size() > capacity;
-            }
-        };
+        recentTags = new LruCache(capacity);
         tagsToIgnore = SearchCompiler.Never.INSTANCE;
     }
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java	(revision 11366)
@@ -37,7 +37,33 @@
 public final class HistoryBrowserDialogManager implements LayerChangeListener {
 
+    static final class UnloadedHistoryPredicate implements Predicate<PrimitiveId> {
+        private final HistoryDataSet hds = HistoryDataSet.getInstance();
+
+        @Override
+        public boolean test(PrimitiveId p) {
+            History h = hds.getHistory(p);
+            if (h == null)
+                // reload if the history is not in the cache yet
+                return true;
+            else
+                // reload if the history object of the selected object is not in the cache yet
+                return !p.isNew() && h.getByVersion(p.getUniqueId()) == null;
+        }
+    }
+
     private static final String WINDOW_GEOMETRY_PREF = HistoryBrowserDialogManager.class.getName() + ".geometry";
 
     private static HistoryBrowserDialogManager instance;
+
+    private final Map<Long, HistoryBrowserDialog> dialogs;
+
+    private final Predicate<PrimitiveId> unloadedHistoryPredicate = new UnloadedHistoryPredicate();
+
+    private final Predicate<PrimitiveId> notNewPredicate = p -> !p.isNew();
+
+    protected HistoryBrowserDialogManager() {
+        dialogs = new HashMap<>();
+        Main.getLayerManager().addLayerChangeListener(this);
+    }
 
     /**
@@ -50,11 +76,4 @@
         }
         return instance;
-    }
-
-    private final Map<Long, HistoryBrowserDialog> dialogs;
-
-    protected HistoryBrowserDialogManager() {
-        dialogs = new HashMap<>();
-        Main.getLayerManager().addLayerChangeListener(this);
     }
 
@@ -211,21 +230,3 @@
         Main.worker.submit(r);
     }
-
-    private final Predicate<PrimitiveId> unloadedHistoryPredicate = new Predicate<PrimitiveId>() {
-
-        private HistoryDataSet hds = HistoryDataSet.getInstance();
-
-        @Override
-        public boolean test(PrimitiveId p) {
-            History h = hds.getHistory(p);
-            if (h == null)
-                // reload if the history is not in the cache yet
-                return true;
-            else
-                // reload if the history object of the selected object is not in the cache yet
-                return !p.isNew() && h.getByVersion(p.getUniqueId()) == null;
-        }
-    };
-
-    private final Predicate<PrimitiveId> notNewPredicate = p -> !p.isNew();
 }
Index: trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 11366)
@@ -44,5 +44,5 @@
  *   <li>on the right, it displays the node list for the version at {@link PointInTimeType#CURRENT_POINT_IN_TIME}</li>
  * </ul>
- *
+ * @since 1709
  */
 public class NodeListViewer extends JPanel {
@@ -74,5 +74,5 @@
         final NodeListTableColumnModel columnModel = new NodeListTableColumnModel();
         final JTable table = new JTable(tableModel, columnModel);
-        tableModel.addTableModelListener(newReversedChangeListener(table, columnModel));
+        tableModel.addTableModelListener(new ReversedChangeListener(table, columnModel));
         table.setName("table.referencenodelisttable");
         table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -87,5 +87,5 @@
         final NodeListTableColumnModel columnModel = new NodeListTableColumnModel();
         final JTable table = new JTable(tableModel, columnModel);
-        tableModel.addTableModelListener(newReversedChangeListener(table, columnModel));
+        tableModel.addTableModelListener(new ReversedChangeListener(table, columnModel));
         table.setName("table.currentnodelisttable");
         table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -94,26 +94,4 @@
         table.addMouseListener(new DoubleClickAdapter(table));
         return table;
-    }
-
-    protected TableModelListener newReversedChangeListener(final JTable table, final NodeListTableColumnModel columnModel) {
-        return new TableModelListener() {
-            private Boolean reversed;
-            private final String nonReversedText = tr("Nodes") + (table.getFont().canDisplay('\u25bc') ? " \u25bc" : " (1-n)");
-            private final String reversedText = tr("Nodes") + (table.getFont().canDisplay('\u25b2') ? " \u25b2" : " (n-1)");
-
-            @Override
-            public void tableChanged(TableModelEvent e) {
-                if (e.getSource() instanceof DiffTableModel) {
-                    final DiffTableModel mod = (DiffTableModel) e.getSource();
-                    if (reversed == null || reversed != mod.isReversed()) {
-                        reversed = mod.isReversed();
-                        columnModel.getColumn(0).setHeaderValue(reversed ? reversedText : nonReversedText);
-                        table.getTableHeader().setToolTipText(
-                                reversed ? tr("The nodes of this way are in reverse order") : null);
-                        table.getTableHeader().repaint();
-                    }
-                }
-            }
-        };
     }
 
@@ -205,4 +183,33 @@
     }
 
+    static final class ReversedChangeListener implements TableModelListener {
+        private final NodeListTableColumnModel columnModel;
+        private final JTable table;
+        private Boolean reversed;
+        private final String nonReversedText;
+        private final String reversedText;
+
+        ReversedChangeListener(JTable table, NodeListTableColumnModel columnModel) {
+            this.columnModel = columnModel;
+            this.table = table;
+            nonReversedText = tr("Nodes") + (table.getFont().canDisplay('\u25bc') ? " \u25bc" : " (1-n)");
+            reversedText = tr("Nodes") + (table.getFont().canDisplay('\u25b2') ? " \u25b2" : " (n-1)");
+        }
+
+        @Override
+        public void tableChanged(TableModelEvent e) {
+            if (e.getSource() instanceof DiffTableModel) {
+                final DiffTableModel mod = (DiffTableModel) e.getSource();
+                if (reversed == null || reversed != mod.isReversed()) {
+                    reversed = mod.isReversed();
+                    columnModel.getColumn(0).setHeaderValue(reversed ? reversedText : nonReversedText);
+                    table.getTableHeader().setToolTipText(
+                            reversed ? tr("The nodes of this way are in reverse order") : null);
+                    table.getTableHeader().repaint();
+                }
+            }
+        }
+    }
+
     static class NodeListPopupMenu extends JPopupMenu {
         private final ZoomToNodeAction zoomToNodeAction;
Index: trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 11366)
@@ -131,14 +131,5 @@
     public void setHistoryComboBoxDownFocusTraversalHandler(final Action handler, final HistoryComboBox hcb) {
         hcb.getEditor().addActionListener(handler);
-        hcb.getEditorComponent().addKeyListener(
-                new KeyAdapter() {
-                    @Override
-                    public void keyTyped(KeyEvent e) {
-                        if (e.getKeyCode() == KeyEvent.VK_TAB) {
-                            handler.actionPerformed(new ActionEvent(hcb, 0, "focusDown"));
-                        }
-                    }
-                }
-        );
+        hcb.getEditorComponent().addKeyListener(new HistoryComboBoxKeyAdapter(hcb, handler));
     }
 
@@ -184,4 +175,21 @@
     }
 
+    static final class HistoryComboBoxKeyAdapter extends KeyAdapter {
+        private final HistoryComboBox hcb;
+        private final Action handler;
+
+        HistoryComboBoxKeyAdapter(HistoryComboBox hcb, Action handler) {
+            this.hcb = hcb;
+            this.handler = handler;
+        }
+
+        @Override
+        public void keyTyped(KeyEvent e) {
+            if (e.getKeyCode() == KeyEvent.VK_TAB) {
+                handler.actionPerformed(new ActionEvent(hcb, 0, "focusDown"));
+            }
+        }
+    }
+
     /**
      * Updates the changeset comment model upon changes in the input field.
Index: trunk/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java	(revision 11366)
@@ -60,18 +60,5 @@
 
         for (final String file : fileHistory) {
-            add(new AbstractAction() {
-                {
-                    putValue(NAME, file);
-                    putValue("help", ht("/Action/OpenRecent"));
-                    putValue("toolbar", Boolean.FALSE);
-                }
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    File f = new File(file);
-                    OpenFileTask task = new OpenFileTask(Collections.singletonList(f), null);
-                    task.setRecordHistory(true);
-                    Main.worker.submit(task);
-                }
-            });
+            add(new OpenRecentAction(file));
         }
         add(new JSeparator());
@@ -82,4 +69,22 @@
         clearItem.setEnabled(!fileHistory.isEmpty());
         add(clearItem);
+    }
+
+    static final class OpenRecentAction extends AbstractAction {
+        private final String file;
+
+        OpenRecentAction(String file) {
+            this.file = file;
+            putValue(NAME, file);
+            putValue("help", ht("/Action/OpenRecent"));
+            putValue("toolbar", Boolean.FALSE);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            OpenFileTask task = new OpenFileTask(Collections.singletonList(new File(file)), null);
+            task.setRecordHistory(true);
+            Main.worker.submit(task);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 11366)
@@ -225,8 +225,21 @@
 
     private static class LayerListWarningMessagePanel extends JPanel {
+        static final class LayerCellRenderer implements ListCellRenderer<SaveLayerInfo> {
+            private final DefaultListCellRenderer def = new DefaultListCellRenderer();
+
+            @Override
+            public Component getListCellRendererComponent(JList<? extends SaveLayerInfo> list, SaveLayerInfo info, int index,
+                    boolean isSelected, boolean cellHasFocus) {
+                def.setIcon(info.getLayer().getIcon());
+                def.setText(info.getName());
+                return def;
+            }
+        }
+
         private final JLabel lblMessage = new JLabel();
         private final JList<SaveLayerInfo> lstLayers = new JList<>();
 
         LayerListWarningMessagePanel(String msg, List<SaveLayerInfo> infos) {
+            super(new GridBagLayout());
             build();
             lblMessage.setText(msg);
@@ -235,5 +248,4 @@
 
         protected void build() {
-            setLayout(new GridBagLayout());
             GridBagConstraints gc = new GridBagConstraints();
             gc.gridx = 0;
@@ -244,16 +256,5 @@
             add(lblMessage, gc);
             lblMessage.setHorizontalAlignment(JLabel.LEFT);
-            lstLayers.setCellRenderer(
-                    new ListCellRenderer<SaveLayerInfo>() {
-                        private final DefaultListCellRenderer def = new DefaultListCellRenderer();
-                        @Override
-                        public Component getListCellRendererComponent(JList<? extends SaveLayerInfo> list, SaveLayerInfo info, int index,
-                                boolean isSelected, boolean cellHasFocus) {
-                            def.setIcon(info.getLayer().getIcon());
-                            def.setText(info.getName());
-                            return def;
-                        }
-                    }
-            );
+            lstLayers.setCellRenderer(new LayerCellRenderer());
             gc.gridx = 0;
             gc.gridy = 1;
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 11366)
@@ -55,7 +55,7 @@
 import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
 import org.openstreetmap.josm.tools.InputMapUtils;
+import org.openstreetmap.josm.tools.MultiLineFlowLayout;
 import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.WindowGeometry;
-import org.openstreetmap.josm.tools.MultiLineFlowLayout;
 
 /**
@@ -135,11 +135,5 @@
 
         // a tabbed pane with configuration panels in the lower half
-        tpConfigPanels = new JTabbedPane() {
-            @Override
-            public Dimension getPreferredSize() {
-                // make sure the tabbed pane never grabs more space than necessary
-                return super.getMinimumSize();
-            }
-        };
+        tpConfigPanels = new CompactTabbedPane();
 
         pnlBasicUploadSettings = new BasicUploadSettingsPanel(changesetCommentModel, changesetSourceModel);
@@ -414,4 +408,12 @@
     }
 
+    static final class CompactTabbedPane extends JTabbedPane {
+        @Override
+        public Dimension getPreferredSize() {
+            // make sure the tabbed pane never grabs more space than necessary
+            return super.getMinimumSize();
+        }
+    }
+
     /**
      * Handles an upload.
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java	(revision 11366)
@@ -10,4 +10,5 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -196,20 +197,21 @@
 
     static class OsmPrimitiveListModel extends AbstractListModel<OsmPrimitive> {
+        static final class OsmPrimitiveComparator implements Comparator<OsmPrimitive>, Serializable {
+            private final DefaultNameFormatter formatter = DefaultNameFormatter.getInstance();
+
+            @Override
+            public int compare(OsmPrimitive o1, OsmPrimitive o2) {
+                int ret = OsmPrimitiveType.from(o1).compareTo(OsmPrimitiveType.from(o2));
+                if (ret != 0)
+                    return ret;
+                return o1.getDisplayName(formatter).compareTo(o1.getDisplayName(formatter));
+            }
+        }
+
         private transient List<OsmPrimitive> data;
 
         protected void sort() {
-            if (data == null)
-                return;
-            data.sort(new Comparator<OsmPrimitive>() {
-                    private DefaultNameFormatter formatter = DefaultNameFormatter.getInstance();
-                    @Override
-                    public int compare(OsmPrimitive o1, OsmPrimitive o2) {
-                        int ret = OsmPrimitiveType.from(o1).compareTo(OsmPrimitiveType.from(o2));
-                        if (ret != 0)
-                            return ret;
-                        return o1.getDisplayName(formatter).compareTo(o1.getDisplayName(formatter));
-                    }
-                }
-            );
+            if (data != null)
+                data.sort(new OsmPrimitiveComparator());
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 11366)
@@ -141,10 +141,5 @@
 
     /** List of recent relations */
-    private final Map<Relation, Void> recentRelations = new LinkedHashMap<Relation, Void>(PROPERTY_RECENT_RELATIONS_NUMBER.get()+1, 1.1f, true) {
-        @Override
-        protected boolean removeEldestEntry(Map.Entry<Relation, Void> eldest) {
-            return size() > PROPERTY_RECENT_RELATIONS_NUMBER.get();
-        }
-    };
+    private final Map<Relation, Void> recentRelations = new LruCache(PROPERTY_RECENT_RELATIONS_NUMBER.get()+1);
 
     /**
@@ -213,4 +208,15 @@
     static String createLayerName(Object arg) {
         return tr("Data Layer {0}", arg);
+    }
+
+    static final class LruCache extends LinkedHashMap<Relation, Void> {
+        LruCache(int initialCapacity) {
+            super(initialCapacity, 1.1f, true);
+        }
+
+        @Override
+        protected boolean removeEldestEntry(Map.Entry<Relation, Void> eldest) {
+            return size() > PROPERTY_RECENT_RELATIONS_NUMBER.get();
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java	(revision 11366)
@@ -41,4 +41,16 @@
     private final transient GpxLayer layer;
 
+    static final class AudioFileFilter extends FileFilter {
+        @Override
+        public boolean accept(File f) {
+            return f.isDirectory() || Utils.hasExtension(f, "wav");
+        }
+
+        @Override
+        public String getDescription() {
+            return tr("Wave Audio files (*.wav)");
+        }
+    }
+
     private static class Markers {
         public boolean timedMarkersOmitted;
@@ -70,16 +82,5 @@
             return;
         }
-        FileFilter filter = new FileFilter() {
-            @Override
-            public boolean accept(File f) {
-                return f.isDirectory() || Utils.hasExtension(f, "wav");
-            }
-
-            @Override
-            public String getDescription() {
-                return tr("Wave Audio files (*.wav)");
-            }
-        };
-        AbstractFileChooser fc = DiskAccessAction.createAndOpenFileChooser(true, true, null, filter,
+        AbstractFileChooser fc = DiskAccessAction.createAndOpenFileChooser(true, true, null, new AudioFileFilter(),
                 JFileChooser.FILES_ONLY, "markers.lastaudiodirectory");
         if (fc != null) {
Index: trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 11366)
@@ -73,4 +73,5 @@
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableModel;
 
 import org.openstreetmap.josm.Main;
@@ -138,11 +139,5 @@
         selectionModel = new DefaultListSelectionModel();
         activeSourcesModel = new ActiveSourcesModel(selectionModel);
-        tblActiveSources = new JTable(activeSourcesModel) {
-            // some kind of hack to prevent the table from scrolling slightly to the right when clicking on the text
-            @Override
-            public void scrollRectToVisible(Rectangle aRect) {
-                super.scrollRectToVisible(new Rectangle(0, aRect.y, aRect.width, aRect.height));
-            }
-        };
+        tblActiveSources = new ScrollHackTable(activeSourcesModel);
         tblActiveSources.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
         tblActiveSources.setSelectionModel(selectionModel);
@@ -421,4 +416,16 @@
      */
     protected abstract String getStr(I18nString ident);
+
+    static final class ScrollHackTable extends JTable {
+        ScrollHackTable(TableModel dm) {
+            super(dm);
+        }
+
+        // some kind of hack to prevent the table from scrolling slightly to the right when clicking on the text
+        @Override
+        public void scrollRectToVisible(Rectangle aRect) {
+            super.scrollRectToVisible(new Rectangle(0, aRect.y, aRect.width, aRect.height));
+        }
+    }
 
     /**
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java	(revision 11366)
@@ -45,4 +45,14 @@
 public class LafPreference implements SubPreferenceSetting {
 
+    static final class LafListCellRenderer implements ListCellRenderer<LookAndFeelInfo> {
+        private final DefaultListCellRenderer def = new DefaultListCellRenderer();
+
+        @Override
+        public Component getListCellRendererComponent(JList<? extends LookAndFeelInfo> list, LookAndFeelInfo value,
+                int index, boolean isSelected, boolean cellHasFocus) {
+            return def.getListCellRendererComponent(list, value.getName(), index, isSelected, cellHasFocus);
+        }
+    }
+
     /**
      * Factory used to create a new {@code LafPreference}.
@@ -98,12 +108,5 @@
         }
 
-        lafCombo.setRenderer(new ListCellRenderer<LookAndFeelInfo>() {
-            private final DefaultListCellRenderer def = new DefaultListCellRenderer();
-            @Override
-            public Component getListCellRendererComponent(JList<? extends LookAndFeelInfo> list, LookAndFeelInfo value,
-                    int index, boolean isSelected, boolean cellHasFocus) {
-                return def.getListCellRendererComponent(list, value.getName(), index, isSelected, cellHasFocus);
-            }
-        });
+        lafCombo.setRenderer(new LafListCellRenderer());
 
         panel = new VerticallyScrollablePanel(new GridBagLayout());
Index: trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java	(revision 11366)
@@ -26,4 +26,17 @@
  */
 public class PluginListPanel extends VerticallyScrollablePanel {
+    static final class PluginCheckBoxMouseAdapter extends MouseAdapter {
+        private final PluginCheckBox cbPlugin;
+
+        PluginCheckBoxMouseAdapter(PluginCheckBox cbPlugin) {
+            this.cbPlugin = cbPlugin;
+        }
+
+        @Override
+        public void mouseClicked(MouseEvent e) {
+            cbPlugin.doClick();
+        }
+    }
+
     private transient PluginPreferencesModel model;
 
@@ -129,10 +142,5 @@
                     pi.getScaledIcon(),
                     SwingConstants.LEFT);
-            lblPlugin.addMouseListener(new MouseAdapter() {
-                @Override
-                public void mouseClicked(MouseEvent e) {
-                    cbPlugin.doClick();
-                }
-            });
+            lblPlugin.addMouseListener(new PluginCheckBoxMouseAdapter(cbPlugin));
 
             gbc.gridx = 0;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java	(revision 11366)
@@ -41,4 +41,15 @@
  */
 public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
+
+    static final class AutoSizePanel extends JPanel {
+        AutoSizePanel() {
+            super(new GridBagLayout());
+        }
+
+        @Override
+        public Dimension getMinimumSize() {
+            return getPreferredSize();
+        }
+    }
 
     /**
@@ -118,10 +129,5 @@
      */
     protected final JPanel buildHttpProxyConfigurationPanel() {
-        JPanel pnl = new JPanel(new GridBagLayout()) {
-            @Override
-            public Dimension getMinimumSize() {
-                return getPreferredSize();
-            }
-        };
+        JPanel pnl = new AutoSizePanel();
         GridBagConstraints gc = new GridBagConstraints();
 
@@ -194,10 +200,5 @@
      */
     protected final JPanel buildSocksProxyConfigurationPanel() {
-        JPanel pnl = new JPanel(new GridBagLayout()) {
-            @Override
-            public Dimension getMinimumSize() {
-                return getPreferredSize();
-            }
-        };
+        JPanel pnl = new AutoSizePanel();
         GridBagConstraints gc = new GridBagConstraints();
         gc.anchor = GridBagConstraints.WEST;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java	(revision 11366)
@@ -40,4 +40,37 @@
 
     private final transient InputContext privateInputContext = InputContext.getInstance();
+
+    static final class InnerFocusListener implements FocusListener {
+        private final JTextComponent editorComponent;
+
+        InnerFocusListener(JTextComponent editorComponent) {
+            this.editorComponent = editorComponent;
+        }
+
+        @Override
+        public void focusLost(FocusEvent e) {
+            if (Main.map != null) {
+                Main.map.keyDetector.setEnabled(true);
+            }
+        }
+
+        @Override
+        public void focusGained(FocusEvent e) {
+            if (Main.map != null) {
+                Main.map.keyDetector.setEnabled(false);
+            }
+            // save unix system selection (middle mouse paste)
+            Clipboard sysSel = ClipboardUtils.getSystemSelection();
+            if (sysSel != null) {
+                Transferable old = ClipboardUtils.getClipboardContent(sysSel);
+                editorComponent.selectAll();
+                if (old != null) {
+                    sysSel.setContents(old, null);
+                }
+            } else {
+                editorComponent.selectAll();
+            }
+        }
+    }
 
     /**
@@ -185,32 +218,5 @@
         final JTextComponent editorComponent = this.getEditorComponent();
         editorComponent.setDocument(new AutoCompletingComboBoxDocument(this));
-        editorComponent.addFocusListener(
-                new FocusListener() {
-                    @Override
-                    public void focusLost(FocusEvent e) {
-                        if (Main.map != null) {
-                            Main.map.keyDetector.setEnabled(true);
-                        }
-                    }
-
-                    @Override
-                    public void focusGained(FocusEvent e) {
-                        if (Main.map != null) {
-                            Main.map.keyDetector.setEnabled(false);
-                        }
-                        // save unix system selection (middle mouse paste)
-                        Clipboard sysSel = ClipboardUtils.getSystemSelection();
-                        if (sysSel != null) {
-                            Transferable old = ClipboardUtils.getClipboardContent(sysSel);
-                            editorComponent.selectAll();
-                            if (old != null) {
-                                sysSel.setContents(old, null);
-                            }
-                        } else {
-                            editorComponent.selectAll();
-                        }
-                    }
-                }
-        );
+        editorComponent.addFocusListener(new InnerFocusListener(editorComponent));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetLink.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetLink.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetLink.java	(revision 11366)
@@ -25,4 +25,17 @@
 public class PresetLink extends TaggingPresetItem {
 
+    static final class TaggingPresetMouseAdapter extends MouseAdapter {
+        private final TaggingPreset t;
+
+        TaggingPresetMouseAdapter(TaggingPreset t) {
+            this.t = t;
+        }
+
+        @Override
+        public void mouseClicked(MouseEvent e) {
+            t.actionPerformed(null);
+        }
+    }
+
     /** The exact name of the preset to link to. Required. */
     public String preset_name = ""; // NOSONAR
@@ -36,10 +49,5 @@
         TaggingPreset t = found.get();
         JLabel lbl = new TaggingPresetLabel(t);
-        lbl.addMouseListener(new MouseAdapter() {
-            @Override
-            public void mouseClicked(MouseEvent arg0) {
-                t.actionPerformed(null);
-            }
-        });
+        lbl.addMouseListener(new TaggingPresetMouseAdapter(t));
         p.add(lbl, GBC.eol().fill(GBC.HORIZONTAL));
         return false;
Index: trunk/src/org/openstreetmap/josm/io/OverpassDownloadReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OverpassDownloadReader.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/io/OverpassDownloadReader.java	(revision 11366)
@@ -33,4 +33,17 @@
  */
 public class OverpassDownloadReader extends BoundingBoxDownloader {
+
+    static final class OverpassOsmReader extends OsmReader {
+        @Override
+        protected void parseUnknown(boolean printWarning) throws XMLStreamException {
+            if ("remark".equals(parser.getLocalName()) && parser.getEventType() == XMLStreamConstants.START_ELEMENT) {
+                final String text = parser.getElementText();
+                if (text.contains("runtime error")) {
+                    throw new XMLStreamException(text);
+                }
+            }
+            super.parseUnknown(printWarning);
+        }
+    }
 
     final String overpassServer;
@@ -148,16 +161,5 @@
     @Override
     protected DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor) throws IllegalDataException {
-        return new OsmReader() {
-            @Override
-            protected void parseUnknown(boolean printWarning) throws XMLStreamException {
-                if ("remark".equals(parser.getLocalName()) && parser.getEventType() == XMLStreamConstants.START_ELEMENT) {
-                    final String text = parser.getElementText();
-                    if (text.contains("runtime error")) {
-                        throw new XMLStreamException(text);
-                    }
-                }
-                super.parseUnknown(printWarning);
-            }
-        }.doParseDataSet(source, progressMonitor);
+        return new OverpassOsmReader().doParseDataSet(source, progressMonitor);
     }
 
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(revision 11366)
@@ -53,4 +53,17 @@
     private static final Set<String> trustedSenders = new HashSet<>();
 
+    static final class PropertyTableModel extends DefaultTableModel {
+        private final Class<?>[] types = {Boolean.class, String.class, Object.class, ExistingValues.class};
+
+        PropertyTableModel(int rowCount) {
+            super(new String[] {tr("Assume"), tr("Key"), tr("Value"), tr("Existing values")}, rowCount);
+        }
+
+        @Override
+        public Class<?> getColumnClass(int c) {
+            return types[c];
+        }
+    }
+
     /**
      * Class for displaying "delete from ... objects" in the table
@@ -131,12 +144,5 @@
         this.sender = senderName;
 
-        final DefaultTableModel tm = new DefaultTableModel(new String[] {tr("Assume"), tr("Key"), tr("Value"), tr("Existing values")},
-                tags.length) {
-            private final Class<?>[] types = {Boolean.class, String.class, Object.class, ExistingValues.class};
-            @Override
-            public Class<?> getColumnClass(int c) {
-                return types[c];
-            }
-        };
+        final DefaultTableModel tm = new PropertyTableModel(tags.length);
 
         sel = primitives;
Index: trunk/src/org/openstreetmap/josm/tools/MultikeyActionsHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/MultikeyActionsHandler.java	(revision 11365)
+++ trunk/src/org/openstreetmap/josm/tools/MultikeyActionsHandler.java	(revision 11366)
@@ -33,8 +33,25 @@
     private final Map<MultikeyShortcutAction, MyAction> myActions = new HashMap<>();
 
-    private static final class ShowLayersPopupWorker implements Runnable {
+    static final class ShowLayersPopupWorker implements Runnable {
+        static final class StatusLinePopupMenuListener implements PopupMenuListener {
+            @Override
+            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                // Do nothing
+            }
+
+            @Override
+            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
+            }
+
+            @Override
+            public void popupMenuCanceled(PopupMenuEvent e) {
+                // Do nothing
+            }
+        }
+
         private final MyAction action;
 
-        private ShowLayersPopupWorker(MyAction action) {
+        ShowLayersPopupWorker(MyAction action) {
             this.action = action;
         }
@@ -77,25 +94,8 @@
                 }
             }
-            layers.addPopupMenuListener(new PopupMenuListener() {
-
-                @Override
-                public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
-                    // Do nothing
-                }
-
-                @Override
-                public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
-                    Main.map.statusLine.resetHelpText(STATUS_BAR_ID);
-                }
-
-                @Override
-                public void popupMenuCanceled(PopupMenuEvent e) {
-                    // Do nothing
-                }
-            });
-
+            layers.addPopupMenuListener(new StatusLinePopupMenuListener());
             layers.show(Main.parent, Integer.MAX_VALUE, Integer.MAX_VALUE);
             layers.setLocation(Main.parent.getX() + Main.parent.getWidth() - layers.getWidth(),
-                    Main.parent.getY() + Main.parent.getHeight() - layers.getHeight());
+                               Main.parent.getY() + Main.parent.getHeight() - layers.getHeight());
         }
     }
