Index: trunk/src/org/openstreetmap/josm/data/osm/User.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/User.java	(revision 4599)
+++ trunk/src/org/openstreetmap/josm/data/osm/User.java	(revision 4601)
@@ -63,5 +63,5 @@
      * @param name the name
      */
-    public static User  createOsmUser(long uid, String name) {
+    public static User createOsmUser(long uid, String name) {
         User user = userMap.get(uid);
         if (user == null) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 4599)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 4601)
@@ -330,20 +330,8 @@
     static class UserTableModel extends DefaultTableModel {
         private ArrayList<UserInfo> data;
-        private JLabel greenCheckmark;
-        private JLabel greyCheckmark;
-        private JLabel redX;
-        private JLabel empty;
 
         public UserTableModel() {
             setColumnIdentifiers(new String[]{tr("Author"),tr("# Objects"),"%", tr("CT")});
             data = new ArrayList<UserInfo>();
-            greenCheckmark = new JLabel(ImageProvider.get("misc", "green_check.png"));
-            greenCheckmark.setToolTipText(tr("Accepted"));
-            greyCheckmark = new JLabel(ImageProvider.get("misc", "grey_check.png"));
-            greyCheckmark.setToolTipText("Auto-accepted");
-            redX = new JLabel(ImageProvider.get("misc", "red_x.png"));
-            redX.setToolTipText("Declined");
-            empty = new JLabel("");
-            empty.setToolTipText("Undecided");
         }
 
@@ -386,11 +374,5 @@
             case 1: /* count */ return info.count;
             case 2: /* percent */ return NumberFormat.getPercentInstance().format(info.percent);
-            case 3: /* relicensing status */
-                switch(info.getRelicensingStatus()) {
-                case User.STATUS_AGREED: return greenCheckmark;
-                case User.STATUS_AUTO_AGREED: return greyCheckmark;
-                case User.STATUS_NOT_AGREED: return redX;
-                default: return empty; // Undecided or unknown?
-                }
+            case 3: /* relicensing status */ return getRelicensingStatusIcon(info.getRelicensingStatus());
             }
             return null;
@@ -429,3 +411,37 @@
         }
     }
+
+    private static JLabel greenCheckmark;
+    private static JLabel greyCheckmark;
+    private static JLabel redX;
+    private static JLabel empty;
+
+    public static JLabel getRelicensingStatusIcon(int status) {
+        switch(status) {
+        case User.STATUS_AGREED:
+            if (greenCheckmark == null) {
+                greenCheckmark = new JLabel(ImageProvider.get("misc", "green_check.png"));
+                greenCheckmark.setToolTipText(tr("Accepted"));
+            }
+            return greenCheckmark;
+        case User.STATUS_AUTO_AGREED:
+            if (greyCheckmark == null) {
+                greyCheckmark = new JLabel(ImageProvider.get("misc", "grey_check.png"));
+                greyCheckmark.setToolTipText("Auto-accepted");
+            }
+            return greyCheckmark;
+        case User.STATUS_NOT_AGREED:
+            if (redX == null) {
+                redX = new JLabel(ImageProvider.get("misc", "red_x.png"));
+                redX.setToolTipText("Declined");
+            }
+            return redX;
+        default:
+            if (empty == null) {
+                empty = new JLabel("");
+                empty.setToolTipText("Undecided");
+            }
+        }
+        return empty; // Undecided or unknown?
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowser.java	(revision 4599)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowser.java	(revision 4601)
@@ -96,5 +96,5 @@
 
         pane.setOneTouchExpandable(true);
-        pane.setDividerLocation(200);
+        pane.setDividerLocation(300);
 
         Dimension minimumSize = new Dimension(100, 50);
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 4599)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 4601)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -18,4 +19,5 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
@@ -36,4 +38,5 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
+import org.openstreetmap.josm.gui.dialogs.UserListDialog;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -412,15 +415,31 @@
             switch (column) {
             case 0:
+                return Long.toString(getPrimitive(row).getVersion());
+            case 1:
                 return isReferencePointInTime(row);
-            case 1:
+            case 2:
                 return isCurrentPointInTime(row);
-            case 2:
-                if(history == null)
+            case 3:
+                long uId = getPrimitive(row).getUid();
+                User user = User.getById(uId);
+                int status;
+                if (user == null) {
+                    status = User.STATUS_UNKNOWN;
+                } else {
+                    status = user.getRelicensingStatus();
+                }
+                return UserListDialog.getRelicensingStatusIcon(status);
+            case 4: {
+                    HistoryOsmPrimitive p = getPrimitive(row);
+                    if (p != null)
+                        return new SimpleDateFormat().format(p.getTimestamp());
                     return null;
-                if (row < history.getNumVersions())
-                    return history.get(row);
-                if (row == history.getNumVersions())
-                    return latest;
-                return null;
+                }
+            case 5: {
+                    HistoryOsmPrimitive p = getPrimitive(row);
+                    if (p != null)
+                        return "<html>"+p.getUser() + " <font color=gray>(" + p.getUid() + ")</font></html>";
+                    return null;
+                }
             }
             return null;
@@ -431,10 +450,12 @@
             if (!((Boolean) aValue)) return;
             switch (column) {
-            case 0:
+            case 1:
                 setReferencePointInTime(row);
                 break;
-            case 1:
+            case 2:
                 setCurrentPointInTime(row);
                 break;
+            default:
+                return;
             }
             fireTableDataChanged();
@@ -443,5 +464,5 @@
         @Override
         public boolean isCellEditable(int row, int column) {
-            return column < 2;
+            return column >= 1 && column <= 2;
         }
 
@@ -491,4 +512,6 @@
 
         public HistoryOsmPrimitive getPrimitive(int row) {
+            if (history == null)
+                return null;
             return isLatest(row) ? latest : history.get(row);
         }
@@ -507,5 +530,5 @@
         @Override
         public int getColumnCount() {
-            return 3;
+            return 6;
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 4599)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 4601)
@@ -5,4 +5,6 @@
 
 import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
 import java.awt.event.ItemEvent;
@@ -16,4 +18,5 @@
 import javax.swing.DefaultListSelectionModel;
 import javax.swing.JCheckBox;
+import javax.swing.JLabel;
 import javax.swing.JPopupMenu;
 import javax.swing.JRadioButton;
@@ -21,7 +24,9 @@
 import javax.swing.ListSelectionModel;
 import javax.swing.SwingConstants;
+import javax.swing.UIManager;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
 import javax.swing.table.TableCellRenderer;
 
@@ -38,7 +43,21 @@
 
     protected void build() {
+        getTableHeader().setFont(getTableHeader().getFont().deriveFont(9f));
         setRowSelectionAllowed(false);
+        setShowGrid(false);
+        setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+        setBackground(UIManager.getColor("Button.background"));
+        setIntercellSpacing(new Dimension(6, 0));
+        putClientProperty("terminateEditOnFocusLost", true);
         popupMenu = new VersionTablePopupMenu();
         addMouseListener(new PopupMenuTrigger());
+        getModel().addTableModelListener(new TableModelListener() {
+            @Override
+            public void tableChanged(TableModelEvent e) {
+                adjustColumnWidth(VersionTable.this, 0);
+                adjustColumnWidth(VersionTable.this, 4);
+                adjustColumnWidth(VersionTable.this, 5);
+            }
+        });
     }
 
@@ -47,4 +66,11 @@
         model.addObserver(this);
         build();
+    }
+
+    // some kind of hack to prevent the table from scrolling to the
+    // right when clicking on the cells
+    @Override
+    public void scrollRectToVisible(Rectangle aRect) {
+        super.scrollRectToVisible(new Rectangle(0, aRect.y, aRect.width, aRect.height));
     }
 
@@ -135,5 +161,4 @@
 
         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
-            HistoryBrowserModel.VersionTableModel model = (HistoryBrowserModel.VersionTableModel)table.getModel();
             setSelected(value != null && (Boolean)value);
             setHorizontalAlignment(SwingConstants.CENTER);
@@ -169,3 +194,39 @@
         }
     }
+
+    public static class LabelRenderer implements TableCellRenderer {
+        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
+            return (Component) value;
+        }
+    }
+
+    public static class AlignedRenderer extends JLabel implements TableCellRenderer {
+        public AlignedRenderer(int hAlignment) {
+            setHorizontalAlignment(hAlignment);
+        }
+        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
+            String v = value.toString();
+            setText(v);
+            return this;
+        }
+    }
+
+    private static void adjustColumnWidth(JTable tbl, int col) {
+        int maxwidth = 0;
+
+        for (int row=0; row<tbl.getRowCount(); row++) {
+            TableCellRenderer tcr = tbl.getCellRenderer(row, col);
+            Object val = tbl.getValueAt(row, col);
+            Component comp = tcr.getTableCellRendererComponent(tbl, val, false, false, row, col);
+            maxwidth = Math.max(comp.getPreferredSize().width, maxwidth);
+        }
+        TableCellRenderer tcr = tbl.getTableHeader().getDefaultRenderer();
+        Object val = tbl.getColumnModel().getColumn(col).getHeaderValue();
+        Component comp = tcr.getTableCellRendererComponent(tbl, val, false, false, -1, col);
+        maxwidth = Math.max(comp.getPreferredSize().width, maxwidth);
+
+        int spacing = tbl.getIntercellSpacing().width;
+        tbl.getColumnModel().getColumn(col).setPreferredWidth(maxwidth + spacing);
+    }
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionTableCellRenderer.java	(revision 4599)
+++ 	(revision )
@@ -1,148 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.history;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.text.SimpleDateFormat;
-import java.util.HashMap;
-
-import javax.swing.ImageIcon;
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.table.TableCellRenderer;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-/**
- * The {@see TableCellRenderer} for a list of versions in {@see HistoryBrower}
- *
- */
-public class VersionTableCellRenderer extends JLabel implements TableCellRenderer {
-    public final static Color BGCOLOR_SELECTED = new Color(143,170,255);
-
-    protected HashMap<OsmPrimitiveType, ImageIcon> icons = null;
-
-    public VersionTableCellRenderer() {
-        loadIcons();
-        setOpaque(true);
-    }
-
-    protected void loadIcons() {
-        icons = new HashMap<OsmPrimitiveType, ImageIcon>();
-        icons.put(OsmPrimitiveType.NODE, ImageProvider.get("data", "node"));
-        icons.put(OsmPrimitiveType.WAY, ImageProvider.get("data", "way"));
-        icons.put(OsmPrimitiveType.RELATION, ImageProvider.get("data", "relation"));
-    }
-
-    protected void renderIcon(OsmPrimitiveType type) {
-        ImageIcon icon = type == null? null : icons.get(type);
-        setIcon(icon);
-    }
-
-    protected void renderText(HistoryOsmPrimitive primitive) {
-        // render label text
-        //
-        StringBuilder sb = new StringBuilder();
-        if (primitive == null) {
-            sb.append("");
-        } else {
-            String msg = tr(
-                    "Version {0}, {1} (by {2})",
-                    Long.toString(primitive.getVersion()),
-                    new SimpleDateFormat().format(primitive.getTimestamp()),
-                    primitive.getUser()
-            );
-            sb.append(msg);
-        }
-        setText(sb.toString());
-
-        // render tooltip text
-        //
-        sb = new StringBuilder();
-        if (primitive == null) {
-            sb.append("");
-        } else {
-            sb.append(
-                    tr("Version {0} created on {1} by {2}",
-                            Long.toString(primitive.getVersion()),
-                            new SimpleDateFormat().format(primitive.getTimestamp()),
-                            primitive.getUser()
-                    )
-            );
-        }
-        setToolTipText(sb.toString());
-    }
-
-    protected OsmDataLayer getEditLayer() {
-        try {
-            return Main.map.mapView.getEditLayer();
-        } catch(NullPointerException e) {
-            return null;
-        }
-    }
-
-    protected void renderLatestText(OsmPrimitive primitive) {
-        // -- label text
-        StringBuffer sb = new StringBuffer();
-        if (primitive == null) {
-            setText("");
-            return;
-        }
-        if (primitive.isModified()) {
-            sb.append("*");
-        }
-        sb.append(tr("Version {0} in editor", primitive.getVersion()));
-        if (primitive.isDeleted()) {
-            sb.append(tr("[deleted]"));
-        }
-        setText(sb.toString());
-
-        // -- tooltip text
-        sb = new StringBuffer();
-        OsmDataLayer l = getEditLayer();
-
-        sb.append(
-                tr(
-                        "Version {0} currently edited in data layer ''{1}''",
-                        primitive.getId(),
-                        l == null ? tr("unknown") : l.getName()
-                )
-        );
-        setToolTipText(sb.toString());
-    }
-
-    public void renderVersionFromHistory(HistoryOsmPrimitive primitive, JTable table, int row, boolean isSelected) {
-        renderIcon(primitive == null? null : primitive.getType());
-        renderText(primitive);
-    }
-
-    public void renderLatest(OsmPrimitive primitive, JTable table, int row, boolean isSelected) {
-        renderIcon(primitive.getType());
-        renderLatestText(getModel(table).getLatest());
-    }
-
-    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
-            int row, int column) {
-
-        if (value == null)
-            return this;
-
-        if (getModel(table).isLatest(row)) {
-            renderLatest(getModel(table).getLatest(),table, row, isSelected);
-        } else {
-            renderVersionFromHistory((HistoryOsmPrimitive)value, table, row, isSelected);
-        }
-        return this;
-    }
-
-    protected HistoryBrowserModel.VersionTableModel getModel(JTable table) {
-        return (HistoryBrowserModel.VersionTableModel)table.getModel();
-    }
-}
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionTableColumnModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionTableColumnModel.java	(revision 4599)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionTableColumnModel.java	(revision 4601)
@@ -4,7 +4,9 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import javax.swing.SwingConstants;
 import javax.swing.table.DefaultTableColumnModel;
 import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
+
 /**
  * The {@see TableColumnModel} for the table with the list of versions
@@ -14,25 +16,46 @@
     protected void createColumns() {
         TableColumn col = null;
-        TableCellRenderer renderer = new VersionTableCellRenderer();
         VersionTable.RadioButtonRenderer bRenderer = new VersionTable.RadioButtonRenderer();
 
-        // column 0 - Reverence
+        // column 0 - Version
         col = new TableColumn(0);
+        /* translation note: 3 letter abbr. for "Version" */
+        col.setHeaderValue(tr("Ver"));
+        col.setCellRenderer(new VersionTable.AlignedRenderer(SwingConstants.CENTER));
+        col.setResizable(false);
+        addColumn(col);
+        // column 1 - Reverence
+        col = new TableColumn(1);
+        col.setHeaderValue(tr("A"));
         col.setCellRenderer(bRenderer);
         col.setCellEditor(new VersionTable.RadioButtonEditor());
-        col.setMaxWidth(1);
+        col.setMaxWidth(18);
         col.setResizable(false);
         addColumn(col);
-        // column 1 - Current
-        col = new TableColumn(1);
+        // column 2 - Current
+        col = new TableColumn(2);
+        col.setHeaderValue(tr("B"));
         col.setCellRenderer(bRenderer);
         col.setCellEditor(new VersionTable.RadioButtonEditor());
-        col.setMaxWidth(1);
+        col.setPreferredWidth(18);
         col.setResizable(false);
         addColumn(col);
-        // column 2 - Rest
-        col = new TableColumn(2);
-        col.setHeaderValue(tr("Version"));
-        col.setCellRenderer(renderer);
+        // column 3 - CT state
+        col = new TableColumn(3);
+        /* translation note: short for "Contributor Terms" */
+        col.setHeaderValue(tr("CT"));
+        col.setCellRenderer(new VersionTable.LabelRenderer());
+        col.setPreferredWidth(22);
+        col.setResizable(false);
+        addColumn(col);
+        // column 4 - Date
+        col = new TableColumn(4);
+        col.setHeaderValue(tr("Date"));
+        col.setResizable(false);
+        addColumn(col);
+        // column 5 - User
+        col = new TableColumn(5);
+        col.setHeaderValue(tr("User"));
+        col.setResizable(false);
         addColumn(col);
     }
