Index: trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 8474)
+++ trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 8475)
@@ -14,4 +14,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.notes.Note;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
@@ -68,6 +69,11 @@
     }
 
-    protected void launchInfoBrowsersForSelectedPrimitives() {
-        List<OsmPrimitive> primitivesToShow = new ArrayList<>(getCurrentDataSet().getAllSelected());
+    protected void launchInfoBrowsersForSelectedPrimitivesAndNote() {
+        List<OsmPrimitive> primitivesToShow = new ArrayList<>();
+        if (getCurrentDataSet() != null) {
+            primitivesToShow.addAll(getCurrentDataSet().getAllSelected());
+        }
+
+        Note noteToShow = Main.isDisplayingMapView() ? Main.map.noteDialog.getSelectedNote() : null;
 
         // filter out new primitives which are not yet uploaded to the server
@@ -80,5 +86,5 @@
         }
 
-        if (primitivesToShow.isEmpty()) {
+        if (primitivesToShow.isEmpty() && noteToShow == null) {
             JOptionPane.showMessageDialog(
                     Main.parent,
@@ -95,6 +101,20 @@
         if (primitivesToShow.size() > max && !confirmLaunchMultiple(primitivesToShow.size()))
             return;
-        for(int i = 0; i < max; i++) {
-            OpenBrowser.displayUrl(createInfoUrl(primitivesToShow.get(i)));
+        for (int i = 0; i < max; i++) {
+            launchInfoBrowser(primitivesToShow.get(i));
+        }
+
+        if (noteToShow != null) {
+            launchInfoBrowser(noteToShow);
+        }
+    }
+
+    protected final void launchInfoBrowser(Object o) {
+        String url = createInfoUrl(o);
+        if (url != null) {
+            String result = OpenBrowser.displayUrl(url);
+            if (result != null) {
+                Main.warn(result);
+            }
         }
     }
@@ -102,5 +122,5 @@
     @Override
     public void actionPerformed(ActionEvent e) {
-        launchInfoBrowsersForSelectedPrimitives();
+        launchInfoBrowsersForSelectedPrimitivesAndNote();
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java	(revision 8474)
+++ trunk/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java	(revision 8475)
@@ -28,6 +28,10 @@
     @Override
     protected  String createInfoUrl(Object infoObject) {
-        OsmPrimitive primitive = (OsmPrimitive) infoObject;
-        return Main.getBaseBrowseUrl() + "/" + OsmPrimitiveType.from(primitive).getAPIName() + "/" + primitive.getId() + "/history";
+        if (infoObject instanceof OsmPrimitive) {
+            OsmPrimitive primitive = (OsmPrimitive) infoObject;
+            return Main.getBaseBrowseUrl() + "/" + OsmPrimitiveType.from(primitive).getAPIName() + "/" + primitive.getId() + "/history";
+        } else {
+            return null;
+        }
     }
 }
Index: trunk/src/org/openstreetmap/josm/actions/InfoWebAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/InfoWebAction.java	(revision 8474)
+++ trunk/src/org/openstreetmap/josm/actions/InfoWebAction.java	(revision 8475)
@@ -6,6 +6,8 @@
 
 import java.awt.event.KeyEvent;
+import java.util.Collection;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.notes.Note;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -31,7 +33,44 @@
 
     @Override
-    protected  String createInfoUrl(Object infoObject) {
-        OsmPrimitive primitive = (OsmPrimitive)infoObject;
-        return Main.getBaseBrowseUrl() + "/" + OsmPrimitiveType.from(primitive).getAPIName() + "/" + primitive.getId();
+    protected String createInfoUrl(Object infoObject) {
+        if (infoObject instanceof OsmPrimitive) {
+            OsmPrimitive primitive = (OsmPrimitive)infoObject;
+            return Main.getBaseBrowseUrl() + "/" + OsmPrimitiveType.from(primitive).getAPIName() + "/" + primitive.getId();
+        } else if (infoObject instanceof Note) {
+            Note note = (Note)infoObject;
+            return Main.getBaseBrowseUrl() + "/note/" + note.getId();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        super.updateEnabledState();
+        updateEnabledStateWithNotes();
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        super.updateEnabledState(selection);
+        updateEnabledStateWithNotes();
+    }
+
+    private void updateEnabledStateWithNotes() {
+        // Allows enabling if a note is selected, even if no OSM object is selected
+        if (!isEnabled() && Main.isDisplayingMapView()) {
+            if (Main.map.noteDialog.getSelectedNote() != null) {
+                setEnabled(true);
+            }
+        }
+    }
+
+    /**
+     * Called when the note selection has changed.
+     * TODO: make a proper listener mechanism to handle change of note selection
+     * @since 8475
+     */
+    public final void noteSelectionChanged() {
+        updateEnabledState();
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 8474)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 8475)
@@ -216,4 +216,15 @@
         }
         updateButtonStates();
+        // TODO make a proper listener mechanism to handle change of note selection
+        Main.main.menu.infoweb.noteSelectionChanged();
+    }
+
+    /**
+     * Returns the currently selected note, if any.
+     * @return currently selected note, or null
+     * @since 8475
+     */
+    public Note getSelectedNote() {
+        return noteData != null ? noteData.getSelectedNote() : null;
     }
 
@@ -254,4 +265,7 @@
         private transient List<Note> data;
 
+        /**
+         * Constructs a new {@code NoteTableModel}.
+         */
         public NoteTableModel() {
             data = new ArrayList<>();
@@ -286,4 +300,7 @@
     class AddCommentAction extends AbstractAction {
 
+        /**
+         * Constructs a new {@code AddCommentAction}.
+         */
         public AddCommentAction() {
             putValue(SHORT_DESCRIPTION,tr("Add comment"));
@@ -315,6 +332,9 @@
     class CloseAction extends AbstractAction {
 
+        /**
+         * Constructs a new {@code CloseAction}.
+         */
         public CloseAction() {
-            putValue(SHORT_DESCRIPTION,tr("Close note"));
+            putValue(SHORT_DESCRIPTION, tr("Close note"));
             putValue(NAME, tr("Close"));
             putValue(SMALL_ICON, ICON_CLOSED);
@@ -337,6 +357,9 @@
     class NewAction extends AbstractAction {
 
+        /**
+         * Constructs a new {@code NewAction}.
+         */
         public NewAction() {
-            putValue(SHORT_DESCRIPTION,tr("Create a new note"));
+            putValue(SHORT_DESCRIPTION, tr("Create a new note"));
             putValue(NAME, tr("Create"));
             putValue(SMALL_ICON, ICON_NEW);
@@ -354,6 +377,9 @@
     class ReopenAction extends AbstractAction {
 
+        /**
+         * Constructs a new {@code ReopenAction}.
+         */
         public ReopenAction() {
-            putValue(SHORT_DESCRIPTION,tr("Reopen note"));
+            putValue(SHORT_DESCRIPTION, tr("Reopen note"));
             putValue(NAME, tr("Reopen"));
             putValue(SMALL_ICON, ICON_OPEN);
@@ -377,4 +403,7 @@
     class SortAction extends AbstractAction {
 
+        /**
+         * Constructs a new {@code SortAction}.
+         */
         public SortAction() {
             putValue(SHORT_DESCRIPTION, tr("Sort notes"));
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 8474)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 8475)
@@ -220,6 +220,10 @@
         @Override
         protected String createInfoUrl(Object infoObject) {
-            User user = (User)infoObject;
-            return Main.getBaseUserUrl() + "/" + Utils.encodeUrl(user.getName()).replaceAll("\\+", "%20");
+            if (infoObject instanceof User) {
+                User user = (User)infoObject;
+                return Main.getBaseUserUrl() + "/" + Utils.encodeUrl(user.getName()).replaceAll("\\+", "%20");
+            } else {
+                return null;
+            }
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 8474)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 8475)
@@ -162,6 +162,10 @@
         @Override
         protected String createInfoUrl(Object infoObject) {
-            HistoryOsmPrimitive primitive = (HistoryOsmPrimitive) infoObject;
-            return Main.getBaseBrowseUrl() + "/changeset/" + primitive.getChangesetId();
+            if (infoObject instanceof HistoryOsmPrimitive) {
+                HistoryOsmPrimitive prim = (HistoryOsmPrimitive) infoObject;
+                return Main.getBaseBrowseUrl() + "/changeset/" + prim.getChangesetId();
+            } else {
+                return null;
+            }
         }
 
@@ -195,6 +199,10 @@
         @Override
         protected String createInfoUrl(Object infoObject) {
-            HistoryOsmPrimitive hp = (HistoryOsmPrimitive) infoObject;
-            return hp.getUser() == null ? null : Main.getBaseUserUrl() + "/" + hp.getUser().getName();
+            if (infoObject instanceof HistoryOsmPrimitive) {
+                HistoryOsmPrimitive hp = (HistoryOsmPrimitive) infoObject;
+                return hp.getUser() == null ? null : Main.getBaseUserUrl() + "/" + hp.getUser().getName();
+            } else {
+                return null;
+            }
         }
 
