Index: core/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- core/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 5380)
+++ core/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(working copy)
@@ -6,22 +6,24 @@
 
 import java.awt.BorderLayout;
 import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dialog.ModalityType;
 import java.awt.Dimension;
 import java.awt.Font;
+import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Point;
 import java.awt.Toolkit;
-import java.awt.Dialog.ModalityType;
 import java.awt.datatransfer.Clipboard;
 import java.awt.datatransfer.Transferable;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
-import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.awt.image.BufferedImage;
 import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URLEncoder;
@@ -34,20 +36,21 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.Vector;
-import java.util.Map.Entry;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.Box;
 import javax.swing.DefaultListCellRenderer;
-import javax.swing.InputMap;
+import javax.swing.ImageIcon;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
@@ -61,7 +64,6 @@
 import javax.swing.JTable;
 import javax.swing.KeyStroke;
 import javax.swing.ListSelectionModel;
-import javax.swing.SwingUtilities;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.event.PopupMenuListener;
@@ -92,8 +94,8 @@
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter;
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
-import org.openstreetmap.josm.data.osm.event.SelectionEventManager;
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
+import org.openstreetmap.josm.data.osm.event.SelectionEventManager;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MapFrame;
@@ -104,6 +106,7 @@
 import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
 import org.openstreetmap.josm.gui.tagging.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.TaggingPreset.PresetType;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox;
@@ -457,6 +460,9 @@
 
     private static String lastAddKey = null;
     private static String lastAddValue = null;
+    // LRU cache for recently added tags (http://java-planet.blogspot.com/2005/08/how-to-set-up-simple-lru-cache-using.html) 
+    private static final Map<Tag, Void> recentTags = new LinkedHashMap<Tag, Void>(5, 1.1f, true);
+    
     /**
      * Open the add selection dialog and add a new key/value to the table (and
      * to the dataset, of course).
@@ -472,10 +478,10 @@
         }
         if (sel.isEmpty()) return;
 
-        JPanel p = new JPanel(new BorderLayout());
+        JPanel p = new JPanel(new GridBagLayout());
         p.add(new JLabel("<html>"+trn("This will change up to {0} object.",
                 "This will change up to {0} objects.", sel.size(),sel.size())
-                +"<br><br>"+tr("Please select a key")), BorderLayout.NORTH);
+                +"<br><br>"+tr("Please select a key")), GBC.eol());
         final AutoCompletingComboBox keys = new AutoCompletingComboBox();
         AutoCompletionManager autocomplete = Main.main.getEditLayer().data.getAutoCompletionManager();
         List<AutoCompletionListItem> keyList = autocomplete.getKeys();
@@ -503,14 +509,12 @@
         keys.setPossibleACItems(keyList);
         keys.setEditable(true);
 
-        p.add(keys, BorderLayout.CENTER);
+        p.add(keys, GBC.eop().fill());
 
-        JPanel p2 = new JPanel(new BorderLayout());
-        p.add(p2, BorderLayout.SOUTH);
-        p2.add(new JLabel(tr("Please select a value")), BorderLayout.NORTH);
+        p.add(new JLabel(tr("Please select a value")), GBC.eol());
         final AutoCompletingComboBox values = new AutoCompletingComboBox();
         values.setEditable(true);
-        p2.add(values, BorderLayout.CENTER);
+        p.add(values, GBC.eop().fill());
         if (itemToSelect != null) {
             keys.setSelectedItem(itemToSelect);
             /* don't add single chars, as they are no properly selected */
@@ -518,6 +522,51 @@
                 values.setSelectedItem(lastAddValue);
             }
         }
+        
+        if (!recentTags.isEmpty()) { 
+            p.add(new JLabel(tr("Recently added tags")), GBC.eol()); 
+        }
+        
+        List<JosmAction> recentTagsActions = new ArrayList<JosmAction>();
+
+        int count = 1;
+        for (final Tag t : recentTags.keySet()) {
+            // Find and display icon
+            ImageIcon icon = MapPaintStyles.getNodeIcon(t);
+            if (icon == null) {
+                icon = new ImageIcon(new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB));
+            }
+            GridBagConstraints gbc = new GridBagConstraints();
+            gbc.ipadx = 5;
+            p.add(new JLabel(icon), gbc);
+            // Create action for reusing the tag, with keyboard shortcut Ctrl+(1-5)
+            String actionShortcutKey = "properties:recent:"+count;
+            Shortcut sc = Shortcut.registerShortcut(actionShortcutKey, null, KeyEvent.VK_0+count, Shortcut.CTRL);
+            final JosmAction action = new JosmAction(actionShortcutKey, null, tr("Use this tag again"), sc, false) {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    keys.getEditor().setItem(t.getKey());
+                    values.getEditor().setItem(t.getValue());
+                }
+            };
+            p.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(sc.getKeyStroke(), actionShortcutKey);
+            p.getActionMap().put(actionShortcutKey, action);
+            recentTagsActions.add(action);
+            // Display clickable tag
+            final JLabel tagLabel = new JLabel("<html>"
+                + "<style>td{border:1px solid gray; font-weight:normal;}</style>" 
+                + "<table><tr><td>" + t.toString() + "</td></tr></table></html>");
+            tagLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+            tagLabel.setToolTipText((String) action.getValue(Action.SHORT_DESCRIPTION));
+            tagLabel.addMouseListener(new MouseAdapter() {
+                @Override
+                public void mouseClicked(MouseEvent e) {
+                    action.actionPerformed(null);
+                }
+            });
+            p.add(tagLabel, GBC.eol());
+            count++;
+        }
 
         FocusAdapter focus = addFocusAdapter(-1, keys, values, autocomplete, defaultACItemComparator);
         // fire focus event in advance or otherwise the popup list will be too small at first
@@ -541,6 +590,10 @@
         JDialog dialog = pane.createDialog(Main.parent, tr("Add value?"));
         dialog.setModalityType(ModalityType.DOCUMENT_MODAL);
         dialog.setVisible(true);
+        
+        for (JosmAction action : recentTagsActions) {
+            action.destroy();
+        }
 
         if (!Integer.valueOf(JOptionPane.OK_OPTION).equals(pane.getValue()))
             return;
@@ -550,10 +603,11 @@
             return;
         lastAddKey = key;
         lastAddValue = value;
+        recentTags.put(new Tag(key, value), null);
         Main.main.undoRedo.add(new ChangePropertyCommand(sel, key, value));
         btnAdd.requestFocusInWindow();
     }
-
+    
     /**
      * @param allData
      * @param keys
Index: core/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
===================================================================
--- core/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java	(revision 5380)
+++ core/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java	(working copy)
@@ -10,6 +10,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -18,7 +19,10 @@
 import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
+import org.openstreetmap.josm.gui.mappaint.StyleCache.StyleList;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
 import org.openstreetmap.josm.gui.mappaint.xml.XmlStyleSource;
 import org.openstreetmap.josm.gui.preferences.SourceEntry;
@@ -118,6 +122,26 @@
                 .setArchive(source.zipIcons)
                 .setOptional(true).get();
     }
+    
+    public static ImageIcon getNodeIcon(Tag tag) {
+        if (tag != null) {
+            Node virtualNode = new Node();
+            virtualNode.put(tag.getKey(), tag.getValue());
+            StyleList styleList = getStyles().generateStyles(virtualNode, 0, null, false).a;
+            if (styleList != null) {
+                for (Iterator<ElemStyle> it = styleList.iterator(); it.hasNext(); ) {
+                    ElemStyle style = styleList.iterator().next();
+                    if (style instanceof NodeElemStyle) {
+                        MapImage mapImage = ((NodeElemStyle) style).mapImage;
+                        if (mapImage != null) {
+                            return new ImageIcon(mapImage.getImage());
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+    }
 
     public static List<String> getIconSourceDirs(StyleSource source) {
         List<String> dirs = new LinkedList<String>();
