Index: src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 3522)
+++ src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(working copy)
@@ -6,10 +6,11 @@
 
 import java.awt.BorderLayout;
 import java.awt.Component;
+import java.awt.Desktop;
+import java.awt.Dialog.ModalityType;
 import java.awt.Font;
 import java.awt.GridBagLayout;
 import java.awt.Point;
-import java.awt.Dialog.ModalityType;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.FocusAdapter;
@@ -17,6 +18,8 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.net.HttpURLConnection;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -24,10 +27,11 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.TreeMap;
 import java.util.Vector;
-import java.util.Map.Entry;
 
 import javax.swing.AbstractAction;
 import javax.swing.Box;
@@ -67,8 +71,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;
@@ -704,6 +708,14 @@
         getActionMap().put("delete", deleteAction);
         buttonPanel.add(this.btnDel);
         add(buttonPanel, BorderLayout.SOUTH);
+
+        // -- help action
+        //
+        HelpAction helpAction = new HelpAction();
+        propertyTable.getSelectionModel().addListSelectionListener(helpAction);
+        getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
+                KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "onHelp");
+        getActionMap().put("onHelp", helpAction);
     }
 
     @Override public void setVisible(boolean b) {
@@ -1021,6 +1033,76 @@
         }
     }
 
+    class HelpAction extends AbstractAction implements ListSelectionListener {
+        public HelpAction() {
+            putValue(NAME, tr("Help"));
+            putValue(SHORT_DESCRIPTION, tr("Launch browser with wiki help to selected object"));
+            updateEnabledState();
+        }
+
+        @SuppressWarnings("unchecked")
+        public void actionPerformed(ActionEvent e) {
+            if (!isEnabled())
+                return;
+
+            try {
+                String base = new String("http://wiki.openstreetmap.org/wiki/");
+                String l = Locale.getDefault().getCountry() + ":";
+                Vector<URI> v = new Vector<URI>();
+
+                String uri;
+                int row;
+                if (propertyTable.getSelectedRowCount() == 1) {
+                    row = propertyTable.getSelectedRow();
+                    uri = base + l + "Tag:" +
+                    propertyData.getValueAt(row, 0).toString() + "=" +
+                    ((Map<String,Integer>)propertyData.getValueAt(row, 1)).entrySet().iterator().next().getKey();
+
+                    v.add(new URI(uri));
+                    v.add(new URI(uri.substring(0, uri.indexOf('=')).replace("Tag:", "Key:")));
+                    v.add(new URI(base + l + "Map_Features"));
+                } else if (membershipTable.getSelectedRowCount() == 1) {
+                    row = membershipTable.getSelectedRow();
+                    uri = base + l + "Relation:" + ((Relation)membershipData.getValueAt(row, 0)).get("type");
+
+                    v.add(new URI(uri));
+                    v.add(new URI(uri = base + l + "Relations"));
+                }
+
+                // try all localized variants and if they are not available, try default as well
+                for (row = 0; row < v.size(); row++) {
+                    v.insertElementAt(new URI(v.get(row).toString().replace(l, "")), ++row);
+                }
+                // find a page that actually exists in the wiki
+                while ( !v.isEmpty() &&
+                        ((HttpURLConnection) v.firstElement().toURL().openConnection())
+                        .getResponseCode() != 200) {
+                    System.out.println("INFO: looking for " + v.firstElement());
+                    v.remove(0);
+                }
+
+                // browse the help page
+                if (!v.isEmpty()) {
+                    System.out.println("INFO: browsing to url " + v.firstElement());
+                    Desktop.getDesktop().browse(v.firstElement());
+                }
+            } catch (Exception e1) {
+                e1.printStackTrace();
+            }
+        }
+
+        protected void updateEnabledState() {
+            setEnabled(
+                    propertyTable.getSelectedRowCount() == 1
+                    ^ membershipTable.getSelectedRowCount() == 1
+            );
+        }
+
+        public void valueChanged(ListSelectionEvent e) {
+            updateEnabledState();
+        }
+    }
+
     static class SelectRelationAction extends AbstractAction {
         boolean selectionmode;
         Relation relation;
