Index: src/org/openstreetmap/josm/Main.java
===================================================================
--- src/org/openstreetmap/josm/Main.java	(revision 126)
+++ src/org/openstreetmap/josm/Main.java	(revision 128)
@@ -12,5 +12,4 @@
 import java.net.URISyntaxException;
 import java.util.Collection;
-import java.util.LinkedList;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -37,17 +36,12 @@
 import org.openstreetmap.josm.actions.PreferencesAction;
 import org.openstreetmap.josm.actions.RedoAction;
+import org.openstreetmap.josm.actions.ReverseSegmentAction;
 import org.openstreetmap.josm.actions.SaveAction;
 import org.openstreetmap.josm.actions.UndoAction;
 import org.openstreetmap.josm.actions.UploadAction;
 import org.openstreetmap.josm.actions.mapmode.MapMode;
-import org.openstreetmap.josm.command.ChangeCommand;
-import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Segment;
 import org.openstreetmap.josm.data.projection.Epsg4326;
 import org.openstreetmap.josm.data.projection.Projection;
@@ -165,36 +159,5 @@
 		annotationTesterAction.putValue(Action.NAME, tr("Annotation Preset Tester"));
 		annotationTesterAction.putValue(Action.SMALL_ICON, ImageProvider.get("annotation-tester"));
-		final Action reverseSegmentAction = new AbstractAction(){
-			public void actionPerformed(ActionEvent e) {
-				Collection<OsmPrimitive> sel = Main.ds.getSelected();
-				boolean hasSegments = false;
-				for (OsmPrimitive osm : sel) {
-					if (osm instanceof Segment) {
-						hasSegments = true;
-						break;
-					}
-				}
-				if (!hasSegments) {
-					JOptionPane.showMessageDialog(Main.parent, tr("Please select at least one segment."));
-					return;
-				}
-				Collection<Command> c = new LinkedList<Command>();
-				for (OsmPrimitive osm : sel) {
-					if (!(osm instanceof Segment))
-						continue;
-					Segment s = (Segment)osm;
-					Segment snew = new Segment(s);
-					Node n = snew.from;
-					snew.from = snew.to;
-					snew.to = n;
-					c.add(new ChangeCommand(s, snew));
-				}
-				editLayer().add(new SequenceCommand(tr("Reverse Segments"), c));
-				map.repaint();
-			}
-		};
-		reverseSegmentAction.putValue(Action.NAME, tr("Reverse Segments"));
-		reverseSegmentAction.putValue(Action.SMALL_ICON, ImageProvider.get("segmentflip"));
-
+		final Action reverseSegmentAction = new ReverseSegmentAction();
 		final Action uploadAction = new UploadAction();
 		final Action saveAction = new SaveAction();
Index: src/org/openstreetmap/josm/actions/ReverseSegmentAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/ReverseSegmentAction.java	(revision 128)
+++ src/org/openstreetmap/josm/actions/ReverseSegmentAction.java	(revision 128)
@@ -0,0 +1,56 @@
+/**
+ * 
+ */
+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 java.util.LinkedList;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Segment;
+
+public final class ReverseSegmentAction extends JosmAction {
+
+    public ReverseSegmentAction() {
+    	super(tr("Reverse Segments"), "segmentflip", tr("Revert the direction of all selected Segments."), KeyEvent.VK_R, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK);
+    }
+
+	public void actionPerformed(ActionEvent e) {
+    	Collection<OsmPrimitive> sel = Main.ds.getSelected();
+    	boolean hasSegments = false;
+    	for (OsmPrimitive osm : sel) {
+    		if (osm instanceof Segment) {
+    			hasSegments = true;
+    			break;
+    		}
+    	}
+    	if (!hasSegments) {
+    		JOptionPane.showMessageDialog(Main.parent, tr("Please select at least one segment."));
+    		return;
+    	}
+    	Collection<Command> c = new LinkedList<Command>();
+    	for (OsmPrimitive osm : sel) {
+    		if (!(osm instanceof Segment))
+    			continue;
+    		Segment s = (Segment)osm;
+    		Segment snew = new Segment(s);
+    		Node n = snew.from;
+    		snew.from = snew.to;
+    		snew.to = n;
+    		c.add(new ChangeCommand(s, snew));
+    	}
+    	Main.main.editLayer().add(new SequenceCommand(tr("Reverse Segments"), c));
+    	Main.map.repaint();
+    }
+}
Index: src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapFrame.java	(revision 126)
+++ src/org/openstreetmap/josm/gui/MapFrame.java	(revision 128)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.gui.dialogs.CommandStackDialog;
 import org.openstreetmap.josm.gui.dialogs.ConflictDialog;
+import org.openstreetmap.josm.gui.dialogs.HistoryDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerList;
 import org.openstreetmap.josm.gui.dialogs.PropertiesDialog;
@@ -119,5 +120,6 @@
 		addIconToggle(toggleDialogs, new LayerList(this));
 		addIconToggle(toggleDialogs, new PropertiesDialog(this));
-		addIconToggle(toggleDialogs, new SelectionListDialog(this));
+		addIconToggle(toggleDialogs, new HistoryDialog());
+		addIconToggle(toggleDialogs, new SelectionListDialog());
 		addIconToggle(toggleDialogs, conflictDialog = new ConflictDialog());
 		addIconToggle(toggleDialogs, new CommandStackDialog(this));
Index: src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java	(revision 128)
+++ src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java	(revision 128)
@@ -0,0 +1,179 @@
+package org.openstreetmap.josm.gui.dialogs;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.GridBagLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableCellRenderer;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * History dialog works like follows:
+ * 
+ * There is a history cache hold in the back for primitives of the last refresh.
+ * When the user refreshes, this cache is cleared and all currently selected items
+ * are reloaded.
+ * If the user has selected at least one primitive not in the cache, the list 
+ * is not displayed. Elsewhere, the list of all changes of all currently selected
+ * objects are displayed.
+ * 
+ * @author imi
+ */
+public class HistoryDialog extends ToggleDialog implements SelectionChangedListener {
+
+	public static final Date unifyDate(Date d) {
+		Calendar c = Calendar.getInstance();
+		c.setTime(d);
+		c.set(Calendar.MINUTE, 0);
+		c.set(Calendar.SECOND, 0);
+		return c.getTime();
+	}
+	
+	private static class HistoryItem implements Comparable<HistoryItem> {
+		OsmPrimitive osm;
+		boolean visible;
+		
+		public int compareTo(HistoryItem o) {
+	        return unifyDate(osm.timestamp).compareTo(unifyDate(o.osm.timestamp));
+        }
+	}
+
+	private final DefaultTableModel data = new DefaultTableModel(){
+		@Override public boolean isCellEditable(int row, int column) {
+			return false;
+		}
+	};
+	/**
+	 * Main table. 3 columns:
+	 * Object | Date | visible (icon, no text)
+	 */
+	private JTable history = new JTable(data);
+
+	private Map<OsmPrimitive, List<HistoryItem>> cache = new HashMap<OsmPrimitive, List<HistoryItem>>();
+	private JLabel notLoaded = new JLabel("<html><i><p align=\"center\">"+tr("Click Reload to refresh list")+"</p></i></html>");
+	private JButton reloadButton = new JButton(tr("Reload"), ImageProvider.get("dialogs/refresh"));
+	private JButton revertButton = new JButton(tr("Revert"), ImageProvider.get("dialogs/revert"));
+
+	public HistoryDialog() {
+		super(tr("History"), "history", tr("Display the history of all selected items."), KeyEvent.VK_H, 150);
+		history.setVisible(false);
+		notLoaded.setVisible(true);
+
+		history.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
+			@Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+				return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+			}
+		});
+		data.setColumnIdentifiers(new Object[]{tr("Object"),tr("Date"),""});
+		history.getColumnModel().getColumn(0).setPreferredWidth(200);
+		history.getColumnModel().getColumn(1).setPreferredWidth(200);
+		history.getColumnModel().getColumn(2).setPreferredWidth(20);
+		final TableCellRenderer oldRenderer = history.getTableHeader().getDefaultRenderer();
+		history.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer(){
+			@Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+	            JComponent c = (JComponent)oldRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+	            if (!value.equals(""))
+	            	return c;
+	            JLabel l = new JLabel(ImageProvider.get("misc","showhide"));
+	            l.setForeground(c.getForeground());
+	            l.setBackground(c.getBackground());
+	            l.setFont(c.getFont());
+	            l.setBorder(c.getBorder());
+	            l.setOpaque(true);
+	            return l;
+            }
+		});
+
+		JPanel centerPanel = new JPanel(new GridBagLayout());
+		centerPanel.add(notLoaded, GBC.eol().fill(GBC.BOTH));
+		centerPanel.add(new JScrollPane(history), GBC.eol().fill(GBC.BOTH));
+		add(centerPanel, BorderLayout.CENTER);
+
+		JPanel buttons = new JPanel(new GridLayout(1,2));
+		buttons.add(reloadButton);
+		buttons.add(revertButton);
+		add(buttons, BorderLayout.SOUTH);
+
+		reloadButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+				reload();
+			}
+		});
+		reloadButton.setToolTipText(tr("Reload all currently selected objects and refresh the list."));
+		revertButton.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+				JOptionPane.showMessageDialog(Main.parent, tr("Not implemented yet."));
+			}
+		});
+		revertButton.setToolTipText(tr("Revert the state of all currently selected objects to the version selected in the history list."));
+	}
+
+
+	@Override public void setVisible(boolean b) {
+		if (b) {
+			Main.ds.addSelectionChangedListener(this);
+			selectionChanged(Main.ds.getSelected());
+		} else {
+			Main.ds.removeSelectionChangedListener(this);
+		}
+		super.setVisible(b);
+	}
+
+
+	public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+		update();
+	}
+
+	/**
+	 * Identify all new objects in the selection and if any, hide the list.
+	 * Else, update the list with the selected items shown.
+	 */
+	private void update() {
+		Collection<OsmPrimitive> sel = Main.ds.getSelected();
+		if (!cache.keySet().containsAll(sel)) {
+			history.setVisible(false);
+			notLoaded.setVisible(true);
+		} else {
+			SortedSet<HistoryItem> orderedHistory = new TreeSet<HistoryItem>();
+			for (OsmPrimitive osm : sel)
+				orderedHistory.addAll(cache.get(osm));
+			data.setRowCount(0);
+			for (HistoryItem i : orderedHistory)
+				data.addRow(new Object[]{i.osm, i.osm.timestamp, i.visible});
+			history.setVisible(true);
+			notLoaded.setVisible(false);
+		}
+	}
+
+	void reload() {
+		JOptionPane.showMessageDialog(Main.parent, tr("Not implemented yet."));
+	}
+}
Index: src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 126)
+++ src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 128)
@@ -36,5 +36,4 @@
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
@@ -111,9 +110,5 @@
 	private JList displaylist = new JList(list);
 
-	/**
-	 * Create a SelectionList dialog.
-	 * @param mapView The mapView to get the dataset from.
-	 */
-	public SelectionListDialog(MapFrame mapFrame) {
+	public SelectionListDialog() {
 		super(tr("Current Selection"), "selectionlist", tr("Open a selection list window."), KeyEvent.VK_E, 150);
 		displaylist.setCellRenderer(new OsmPrimitivRenderer());
