diff --git a/src/org/openstreetmap/josm/actions/HistoryInfoAction.java b/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
index 928335d..4d97f0b 100644
--- a/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
+++ b/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
@@ -1,31 +1,50 @@
 //License: GPL. Copyright 2007 by Immanuel Scholz and others
 package org.openstreetmap.josm.actions;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
+import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.util.Collection;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
 import org.openstreetmap.josm.tools.Shortcut;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 
-public class HistoryInfoAction extends AbstractInfoAction {
-
-    public HistoryInfoAction() {
-        super(tr("Object history"), "about",
-                tr("Display history information about OSM ways, nodes, or relations."),
-                Shortcut.registerShortcut("core:history",
-                        tr("Object history"), KeyEvent.VK_H, Shortcut.GROUP_HOTKEY), false);
-        putValue("help", ht("/Action/ObjectHistory"));
-        putValue("toolbar", "action/historyinfo");
-        Main.toolbar.register(this);
-    }
-
-    @Override
-    protected  String createInfoUrl(Object infoObject) {
-        OsmPrimitive primitive = (OsmPrimitive)infoObject;
-        return getBaseBrowseUrl() + "/" + OsmPrimitiveType.from(primitive).getAPIName() + "/" + primitive.getId() + "/history";
-    }
+public class HistoryInfoAction extends JosmAction {
+
+	public HistoryInfoAction() {
+		super(tr("History"), "about",
+				tr("Display history information about OSM ways, nodes, or relations."),
+				Shortcut.registerShortcut("core:historyinfo",
+				tr("History"), KeyEvent.VK_H, Shortcut.GROUP_HOTKEY), false);
+		putValue("help", ht("/Action/ObjectHistory"));
+		putValue("toolbar", "action/historyinfo");
+		Main.toolbar.register(this);
+	}
+
+	@Override
+	public void actionPerformed(ActionEvent ae) {
+		DataSet set = getCurrentDataSet();
+		if (set != null) {
+			HistoryBrowserDialogManager.getInstance().showHistory(set.getSelected());
+		}
+	}
+
+	@Override
+	public void updateEnabledState() {
+		if (getCurrentDataSet() == null) {
+			setEnabled(false);
+		} else {
+			updateEnabledState(getCurrentDataSet().getSelected());
+		}
+	}
+
+	@Override
+	protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+		setEnabled(!selection.isEmpty());
+	}
 }
diff --git a/src/org/openstreetmap/josm/actions/HistoryInfoWebbrowserAction.java b/src/org/openstreetmap/josm/actions/HistoryInfoWebbrowserAction.java
deleted file mode 100644
index aca7ffe..0000000
--- a/src/org/openstreetmap/josm/actions/HistoryInfoWebbrowserAction.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//License: GPL. Copyright 2007 by Immanuel Scholz and others
-package org.openstreetmap.josm.actions;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.KeyEvent;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.tools.Shortcut;
-import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
-
-public class HistoryInfoWebbrowserAction extends AbstractInfoAction {
-
-    public HistoryInfoWebbrowserAction() {
-        super(tr("History (web)"), "about",
-                tr("Display history information about OSM ways, nodes, or relations in web browser."),
-                Shortcut.registerShortcut("core:historybrowser",
-                        tr("Object history (web browser)"), KeyEvent.VK_H, Shortcut.GROUP_HOTKEY, Shortcut.SHIFT_DEFAULT), false);
-        putValue("help", ht("/Action/ObjectHistory"));
-			putValue("toolbar", "action/historybrowserinfo");
-        Main.toolbar.register(this);
-    }
-
-    @Override
-    protected  String createInfoUrl(Object infoObject) {
-        OsmPrimitive primitive = (OsmPrimitive) infoObject;
-        return getBaseBrowseUrl() + "/" + OsmPrimitiveType.from(primitive).getAPIName() + "/" + primitive.getId() + "/history";
-    }
-}
diff --git a/src/org/openstreetmap/josm/actions/InfoAction.java b/src/org/openstreetmap/josm/actions/InfoAction.java
index d89a70e..27d5c66 100644
--- a/src/org/openstreetmap/josm/actions/InfoAction.java
+++ b/src/org/openstreetmap/josm/actions/InfoAction.java
@@ -1,31 +1,50 @@
 //License: GPL. Copyright 2007 by Immanuel Scholz and others
 package org.openstreetmap.josm.actions;
 
+import java.awt.event.ActionEvent;
 import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 
 import java.awt.event.KeyEvent;
 
+import java.util.Collection;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.gui.dialogs.InspectPrimitiveDialog;
 import org.openstreetmap.josm.tools.Shortcut;
 
-public class InfoAction extends AbstractInfoAction {
+public class InfoAction extends JosmAction {
 
     public InfoAction() {
-        super(tr("Info about Element"), "about",
-                tr("Display object information about OSM nodes, ways, or relations."),
-                Shortcut.registerShortcut("core:information",
-                        tr("Info about Element"), KeyEvent.VK_I, Shortcut.GROUP_HOTKEY), false);
+        super(tr("Advanced info"), "about",
+                tr("Display advanced object information about OSM nodes, ways, or relations."),
+                Shortcut.registerShortcut("core:info",
+                tr("Advanced info"), KeyEvent.VK_I, Shortcut.GROUP_HOTKEY), false);
         putValue("help", ht("/Action/InfoAboutElements"));
         putValue("toolbar", "action/info");
         Main.toolbar.register(this);
     }
 
     @Override
-    protected  String createInfoUrl(Object infoObject) {
-        OsmPrimitive primitive = (OsmPrimitive)infoObject;
-        return getBaseBrowseUrl() + "/" + OsmPrimitiveType.from(primitive).getAPIName() + "/" + primitive.getId();
+    public void actionPerformed(ActionEvent ae) {
+        DataSet set = getCurrentDataSet();
+		if (set != null) {
+			new InspectPrimitiveDialog(set.getSelected(), Main.map.mapView.getEditLayer()).showDialog();
+		}
+    }
+
+    @Override
+    public void updateEnabledState() {
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(!selection.isEmpty());
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java
index 311f8d3..f3c3306 100644
--- a/src/org/openstreetmap/josm/gui/MainMenu.java
+++ b/src/org/openstreetmap/josm/gui/MainMenu.java
@@ -38,7 +38,9 @@ import org.openstreetmap.josm.actions.FullscreenToggleAction;
 import org.openstreetmap.josm.actions.GpxExportAction;
 import org.openstreetmap.josm.actions.HelpAction;
 import org.openstreetmap.josm.actions.HistoryInfoAction;
+import org.openstreetmap.josm.actions.HistoryInfoWebAction;
 import org.openstreetmap.josm.actions.InfoAction;
+import org.openstreetmap.josm.actions.InfoWebAction;
 import org.openstreetmap.josm.actions.JoinAreasAction;
 import org.openstreetmap.josm.actions.JoinNodeWayAction;
 import org.openstreetmap.josm.actions.JosmAction;
@@ -142,7 +144,9 @@ public class MainMenu extends JMenuBar {
     public final WireframeToggleAction wireFrameToggleAction = new WireframeToggleAction();
     public final JosmAction toggleGPXLines = new ToggleGPXLinesAction();
     public final InfoAction info = new InfoAction();
+    public final InfoWebAction infoweb = new InfoWebAction();
     public final HistoryInfoAction historyinfo = new HistoryInfoAction();
+    public final HistoryInfoWebAction historyinfoweb = new HistoryInfoWebAction();
 
     /* Tools menu */
     public final JosmAction splitWay = new SplitWayAction();
@@ -316,7 +320,9 @@ public class MainMenu extends JMenuBar {
         }
         viewMenu.addSeparator();
         add(viewMenu, info);
+        add(viewMenu, infoweb);
         add(viewMenu, historyinfo);
+		add(viewMenu, historyinfoweb);
 
         add(presetsMenu, presetSearchAction);
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java b/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java
index ba08b87..d781c54 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java
@@ -21,7 +21,6 @@ import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
-import javax.swing.SwingUtilities;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.table.DefaultTableCellRenderer;
@@ -35,7 +34,6 @@ import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
-import org.openstreetmap.josm.data.osm.history.History;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSetListener;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
@@ -43,7 +41,6 @@ import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
 import org.openstreetmap.josm.gui.history.HistoryLoadTask;
-import org.openstreetmap.josm.tools.BugReportExceptionHandler;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -289,7 +286,7 @@ public class HistoryDialog extends ToggleDialog implements HistoryDataSetListene
         public void mouseClicked(MouseEvent e) {
             if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
                 int row = historyTable.rowAtPoint(e.getPoint());
-                new ShowHistoryAction().showHistory(Collections.singletonList(model.getPrimitive(row)));
+                HistoryBrowserDialogManager.getInstance().showHistory(Collections.singletonList(model.getPrimitive(row)));
             }
         }
     }
@@ -305,57 +302,10 @@ public class HistoryDialog extends ToggleDialog implements HistoryDataSetListene
             updateEnabledState();
         }
 
-        protected List<OsmPrimitive> filterPrimitivesWithUnloadedHistory(Collection<OsmPrimitive> primitives) {
-            ArrayList<OsmPrimitive> ret = new ArrayList<OsmPrimitive>(primitives.size());
-            HistoryDataSet hds = HistoryDataSet.getInstance();
-            for (OsmPrimitive p: primitives) {
-                if (hds.getHistory(p.getPrimitiveId()) == null) {
-                    // reload if the history is not in the cache yet
-                    ret.add(p);
-                } else if (!p.isNew() && hds.getHistory(p.getPrimitiveId()).getByVersion(p.getUniqueId()) == null) {
-                    // reload if the history object of the selected object is not in the cache
-                    // yet
-                    ret.add(p);
-                }
-            }
-            return ret;
-        }
-
-        public void showHistory(final List<OsmPrimitive> primitives) {
-            List<OsmPrimitive> toLoad = filterPrimitivesWithUnloadedHistory(primitives);
-            if (!toLoad.isEmpty()) {
-                HistoryLoadTask task = new HistoryLoadTask();
-                task.add(primitives);
-                Main.worker.submit(task);
-            }
-
-            Runnable r = new Runnable() {
-                public void run() {
-                    try {
-                        for (OsmPrimitive p : primitives) {
-                            History h = HistoryDataSet.getInstance().getHistory(p.getPrimitiveId());
-                            if (h == null) {
-                                continue;
-                            }
-                            HistoryBrowserDialogManager.getInstance().show(h);
-                        }
-                    } catch (final Exception e) {
-                        SwingUtilities.invokeLater(new Runnable() {
-                            public void run() {
-                                BugReportExceptionHandler.handleException(e);
-                            }
-                        });
-                    }
-
-                }
-            };
-            Main.worker.submit(r);
-        }
-
         public void actionPerformed(ActionEvent e) {
             int [] rows = historyTable.getSelectedRows();
             if (rows == null || rows.length == 0) return;
-            showHistory(model.getPrimitives(rows));
+            HistoryBrowserDialogManager.getInstance().showHistory(model.getPrimitives(rows));
         }
 
         protected void updateEnabledState() {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
index 1a9ff34..cf0a19b 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
@@ -16,7 +16,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -25,7 +24,6 @@ import java.util.Set;
 import javax.swing.AbstractAction;
 import javax.swing.AbstractListModel;
 import javax.swing.DefaultListSelectionModel;
-import javax.swing.JButton;
 import javax.swing.JList;
 import javax.swing.JMenuItem;
 import javax.swing.JPopupMenu;
@@ -87,7 +85,6 @@ public class SelectionListDialog extends ToggleDialog  {
     private SetRelationSelection actSetRelationSelection;
     private EditRelationSelection actEditRelationSelection;
     private DownloadSelectedIncompleteMembersAction actDownloadSelectedIncompleteMembers;
-    private InspectAction actInspect;
 
     /**
      * Builds the content panel for this dialog
@@ -147,9 +144,6 @@ public class SelectionListDialog extends ToggleDialog  {
         actDownloadSelectedIncompleteMembers = new DownloadSelectedIncompleteMembersAction();
         lstPrimitives.getSelectionModel().addListSelectionListener(actDownloadSelectedIncompleteMembers);
 
-        actInspect = new InspectAction();
-        lstPrimitives.getSelectionModel().addListSelectionListener(actInspect);
-
         lstPrimitives.addMouseListener(new SelectionPopupMenuLauncher());
         lstPrimitives.addMouseListener(new DblClickHandler());
     }
@@ -220,8 +214,6 @@ public class SelectionListDialog extends ToggleDialog  {
             add(actEditRelationSelection);
             addSeparator();
             add(actDownloadSelectedIncompleteMembers);
-            addSeparator();
-            add(actInspect);
         }
     }
 
@@ -850,29 +842,6 @@ public class SelectionListDialog extends ToggleDialog  {
         }
     }
 
-    class InspectAction extends AbstractAction implements ListSelectionListener {
-        public InspectAction() {
-            putValue(SHORT_DESCRIPTION, tr("Get detailed information on the internal state of the objects."));
-            putValue(NAME, tr("Inspect"));
-            updateEnabledState();
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            Collection<OsmPrimitive> sel = model.getSelected();
-            if (sel.isEmpty()) return;
-            InspectPrimitiveDialog inspectDialog = new InspectPrimitiveDialog(sel, Main.map.mapView.getEditLayer());
-            inspectDialog.showDialog();
-        }
-
-        public void updateEnabledState() {
-            setEnabled(!model.getSelected().isEmpty());
-        }
-
-        public void valueChanged(ListSelectionEvent e) {
-            updateEnabledState();
-        }
-    }
-
     /** Quicker comparator, comparing just by type and ID's */
     static private class OsmPrimitiveQuickComparator implements Comparator<OsmPrimitive> {
 
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
index 5d24dd8..e285a2d 100644
--- a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
+++ b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
@@ -1,16 +1,26 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.history;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 import java.awt.Dimension;
 import java.awt.Point;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.history.History;
+import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.tools.BugReportExceptionHandler;
+import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.WindowGeometry;
 
 public class HistoryBrowserDialogManager implements MapView.LayerChangeListener {
@@ -122,4 +132,75 @@ public class HistoryBrowserDialogManager implements MapView.LayerChangeListener
             hideAll();
         }
     }
+
+	public void showHistory(final Collection<OsmPrimitive> primitives) {
+		final Collection<OsmPrimitive> notNewPrimitives = Utils.filter(primitives, notNewPredicate);
+		if (notNewPrimitives.isEmpty()) {
+			JOptionPane.showMessageDialog(
+					Main.parent,
+					tr("Please select at least one already uploaded node, way, or relation."),
+					tr("Warning"),
+					JOptionPane.WARNING_MESSAGE);
+			return;
+		}
+		Collection<OsmPrimitive> toLoad = Utils.filter(primitives, unloadedHistoryPredicate);
+		if (!toLoad.isEmpty()) {
+			HistoryLoadTask task = new HistoryLoadTask();
+			task.add(notNewPrimitives);
+			Main.worker.submit(task);
+		}
+
+		Runnable r = new Runnable() {
+
+			@Override
+			public void run() {
+				try {
+					for (OsmPrimitive p : notNewPrimitives) {
+						History h = HistoryDataSet.getInstance().getHistory(p.getPrimitiveId());
+						if (h == null) {
+							continue;
+						}
+						show(h);
+					}
+				} catch (final Exception e) {
+					SwingUtilities.invokeLater(new Runnable() {
+
+						@Override
+						public void run() {
+							BugReportExceptionHandler.handleException(e);
+						}
+					});
+				}
+
+			}
+		};
+		Main.worker.submit(r);
+	}
+
+	private final Predicate<OsmPrimitive> unloadedHistoryPredicate = new Predicate<OsmPrimitive>() {
+
+		HistoryDataSet hds = HistoryDataSet.getInstance();
+
+		@Override
+		public boolean evaluate(OsmPrimitive p) {
+			if (hds.getHistory(p.getPrimitiveId()) == null) {
+				// reload if the history is not in the cache yet
+				return true;
+			} else if (!p.isNew() && hds.getHistory(p.getPrimitiveId()).getByVersion(p.getUniqueId()) == null) {
+				// reload if the history object of the selected object is not in the cache yet
+				return true;
+			} else {
+				return false;
+			}
+		}
+	};
+
+	private final Predicate<OsmPrimitive> notNewPredicate = new Predicate<OsmPrimitive>() {
+
+		@Override
+		public boolean evaluate(OsmPrimitive p) {
+			return !p.isNew();
+		}
+	};
+
 }
diff --git a/src/org/openstreetmap/josm/tools/Utils.java b/src/org/openstreetmap/josm/tools/Utils.java
index 20f07ce..ae24092 100644
--- a/src/org/openstreetmap/josm/tools/Utils.java
+++ b/src/org/openstreetmap/josm/tools/Utils.java
@@ -54,6 +54,10 @@ public class Utils {
         }
         return null;
     }
+
+	public static <T> Collection<T> filter(Collection<? extends T> collection, Predicate<? super T> predicate) {
+		return new FilteredCollection<T>(collection, predicate);
+	}
     
     /**
      * Filter a collection by (sub)class.
