Index: /trunk/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java	(revision 6207)
+++ /trunk/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java	(revision 6207)
@@ -0,0 +1,127 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.history;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+
+import org.openstreetmap.josm.gui.util.AdjustmentSynchronizer;
+
+/**
+ * Base class of {@link TagInfoViewer} and {@link RelationMemberListViewer}.
+ * @since 6207
+ */
+public abstract class HistoryViewerPanel extends JPanel {
+    
+    protected HistoryBrowserModel model;
+    protected VersionInfoPanel referenceInfoPanel;
+    protected VersionInfoPanel currentInfoPanel;
+    protected AdjustmentSynchronizer adjustmentSynchronizer;
+    protected SelectionSynchronizer selectionSynchronizer;
+
+    protected HistoryViewerPanel(HistoryBrowserModel model) {
+        setModel(model);
+        build();
+    }
+    
+    private JScrollPane embedInScrollPane(JTable table) {
+        JScrollPane pane = new JScrollPane(table);
+        pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+        pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+        adjustmentSynchronizer.participateInSynchronizedScrolling(pane.getVerticalScrollBar());
+        return pane;
+    }
+    
+    /**
+     * Sets the history browsing model.
+     * @param model The history browsing model
+     */
+    public final void setModel(HistoryBrowserModel model) {
+        if (this.model != null) {
+            unregisterAsObserver(model);
+        }
+        this.model = model;
+        if (this.model != null) {
+            registerAsObserver(model);
+        }
+    }
+    
+    protected final void unregisterAsObserver(HistoryBrowserModel model) {
+        if (currentInfoPanel != null) {
+            model.deleteObserver(currentInfoPanel);
+        }
+        if (referenceInfoPanel != null) {
+            model.deleteObserver(referenceInfoPanel);
+        }
+    }
+    
+    protected final void registerAsObserver(HistoryBrowserModel model) {
+        if (currentInfoPanel != null) {
+            model.addObserver(currentInfoPanel);
+        }
+        if (referenceInfoPanel != null) {
+            model.addObserver(referenceInfoPanel);
+        }
+    }
+    
+    protected abstract JTable buildReferenceTable();
+    
+    protected abstract JTable buildCurrentTable();
+    
+    private void build() {
+        setLayout(new GridBagLayout());
+        GridBagConstraints gc = new GridBagConstraints();
+
+        // ---------------------------
+        gc.gridx = 0;
+        gc.gridy = 0;
+        gc.gridwidth = 1;
+        gc.gridheight = 1;
+        gc.weightx = 0.5;
+        gc.weighty = 0.0;
+        gc.insets = new Insets(5,5,5,0);
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.anchor = GridBagConstraints.FIRST_LINE_START;
+        referenceInfoPanel = new VersionInfoPanel(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
+        add(referenceInfoPanel,gc);
+
+        gc.gridx = 1;
+        gc.gridy = 0;
+        gc.gridwidth = 1;
+        gc.gridheight = 1;
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.weightx = 0.5;
+        gc.weighty = 0.0;
+        gc.anchor = GridBagConstraints.FIRST_LINE_START;
+        currentInfoPanel = new VersionInfoPanel(model, PointInTimeType.CURRENT_POINT_IN_TIME);
+        add(currentInfoPanel,gc);
+
+        adjustmentSynchronizer = new AdjustmentSynchronizer();
+        selectionSynchronizer = new SelectionSynchronizer();
+
+        // ---------------------------
+        gc.gridx = 0;
+        gc.gridy = 1;
+        gc.gridwidth = 1;
+        gc.gridheight = 1;
+        gc.weightx = 0.5;
+        gc.weighty = 1.0;
+        gc.fill = GridBagConstraints.BOTH;
+        gc.anchor = GridBagConstraints.NORTHWEST;
+        add(embedInScrollPane(buildReferenceTable()),gc);
+
+        gc.gridx = 1;
+        gc.gridy = 1;
+        gc.gridwidth = 1;
+        gc.gridheight = 1;
+        gc.weightx = 0.5;
+        gc.weighty = 1.0;
+        gc.fill = GridBagConstraints.BOTH;
+        gc.anchor = GridBagConstraints.NORTHWEST;
+        add(embedInScrollPane(buildCurrentTable()),gc);
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java	(revision 6206)
+++ /trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java	(revision 6207)
@@ -2,17 +2,10 @@
 package org.openstreetmap.josm.gui.history;
 
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
 import java.awt.Rectangle;
 
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
 import javax.swing.event.TableModelEvent;
 import javax.swing.event.TableModelListener;
-
-import org.openstreetmap.josm.gui.util.AdjustmentSynchronizer;
 
 /**
@@ -26,20 +19,5 @@
  *
  */
-
-public class RelationMemberListViewer extends JPanel{
-
-    private HistoryBrowserModel model;
-    private VersionInfoPanel referenceInfoPanel;
-    private VersionInfoPanel currentInfoPanel;
-    private AdjustmentSynchronizer adjustmentSynchronizer;
-    private SelectionSynchronizer selectionSynchronizer;
-
-    protected JScrollPane embeddInScrollPane(JTable table) {
-        JScrollPane pane = new JScrollPane(table);
-        pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-        pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
-        adjustmentSynchronizer.participateInSynchronizedScrolling(pane.getVerticalScrollBar());
-        return pane;
-    }
+public class RelationMemberListViewer extends HistoryViewerPanel {
 
     protected class MemberModelChanged implements TableModelListener {
@@ -57,5 +35,5 @@
     }
 
-    protected JTable buildReferenceMemberListTable() {
+    protected JTable buildReferenceTable() {
         JTable table = new JTable(
                 model.getRelationMemberTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME),
@@ -69,5 +47,5 @@
     }
 
-    protected JTable buildCurrentMemberListTable() {
+    protected JTable buildCurrentTable() {
         JTable table = new JTable(
                 model.getRelationMemberTableModel(PointInTimeType.CURRENT_POINT_IN_TIME),
@@ -81,87 +59,10 @@
     }
 
-    protected void build() {
-        setLayout(new GridBagLayout());
-        GridBagConstraints gc = new GridBagConstraints();
-
-        // ---------------------------
-        gc.gridx = 0;
-        gc.gridy = 0;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 0.0;
-        gc.insets = new Insets(5,5,5,0);
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.anchor = GridBagConstraints.FIRST_LINE_START;
-        referenceInfoPanel = new VersionInfoPanel(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
-        add(referenceInfoPanel,gc);
-
-        gc.gridx = 1;
-        gc.gridy = 0;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.weightx = 0.5;
-        gc.weighty = 0.0;
-        gc.anchor = GridBagConstraints.FIRST_LINE_START;
-        currentInfoPanel = new VersionInfoPanel(model, PointInTimeType.CURRENT_POINT_IN_TIME);
-        add(currentInfoPanel,gc);
-
-        adjustmentSynchronizer = new AdjustmentSynchronizer();
-        selectionSynchronizer = new SelectionSynchronizer();
-
-        // ---------------------------
-        gc.gridx = 0;
-        gc.gridy = 1;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        add(embeddInScrollPane(buildReferenceMemberListTable()),gc);
-
-        gc.gridx = 1;
-        gc.gridy = 1;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        add(embeddInScrollPane(buildCurrentMemberListTable()),gc);
-    }
-
+    /**
+     * Constructs a new {@code RelationMemberListViewer}.
+     * @param model The history browsing model
+     */
     public RelationMemberListViewer(HistoryBrowserModel model) {
-        setModel(model);
-        build();
-    }
-
-    protected void unregisterAsObserver(HistoryBrowserModel model) {
-        if (currentInfoPanel != null) {
-            model.deleteObserver(currentInfoPanel);
-        }
-        if (referenceInfoPanel != null) {
-            model.deleteObserver(referenceInfoPanel);
-        }
-    }
-    protected void registerAsObserver(HistoryBrowserModel model) {
-        if (currentInfoPanel != null) {
-            model.addObserver(currentInfoPanel);
-        }
-        if (referenceInfoPanel != null) {
-            model.addObserver(referenceInfoPanel);
-        }
-    }
-
-    public void setModel(HistoryBrowserModel model) {
-        if (this.model != null) {
-            unregisterAsObserver(model);
-        }
-        this.model = model;
-        if (this.model != null) {
-            registerAsObserver(model);
-        }
+        super(model);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java	(revision 6206)
+++ /trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java	(revision 6207)
@@ -2,14 +2,6 @@
 package org.openstreetmap.josm.gui.history;
 
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
-
-import org.openstreetmap.josm.gui.util.AdjustmentSynchronizer;
 
 /**
@@ -23,21 +15,7 @@
  *
  */
-public class TagInfoViewer extends JPanel{
+public class TagInfoViewer extends HistoryViewerPanel {
 
-    private HistoryBrowserModel model;
-    private VersionInfoPanel referenceInfoPanel;
-    private VersionInfoPanel currentInfoPanel;
-    private AdjustmentSynchronizer adjustmentSynchronizer;
-    private SelectionSynchronizer selectionSynchronizer;
-
-    protected JScrollPane embeddInScrollPane(JTable table) {
-        JScrollPane pane = new JScrollPane(table);
-        pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-        pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
-        adjustmentSynchronizer.participateInSynchronizedScrolling(pane.getVerticalScrollBar());
-        return pane;
-    }
-
-    protected JTable buildReferenceTagTable() {
+    protected JTable buildReferenceTable() {
         JTable table = new JTable(
                 model.getTagTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME),
@@ -50,5 +28,5 @@
     }
 
-    protected JTable buildCurrentTagTable() {
+    protected JTable buildCurrentTable() {
         JTable table = new JTable(
                 model.getTagTableModel(PointInTimeType.CURRENT_POINT_IN_TIME),
@@ -61,87 +39,10 @@
     }
 
-    protected void build() {
-        setLayout(new GridBagLayout());
-        GridBagConstraints gc = new GridBagConstraints();
-
-        // ---------------------------
-        gc.gridx = 0;
-        gc.gridy = 0;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 0.0;
-        gc.insets = new Insets(5,5,5,0);
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.anchor = GridBagConstraints.FIRST_LINE_START;
-        referenceInfoPanel = new VersionInfoPanel(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
-        add(referenceInfoPanel,gc);
-
-        gc.gridx = 1;
-        gc.gridy = 0;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.weightx = 0.5;
-        gc.weighty = 0.0;
-        gc.anchor = GridBagConstraints.FIRST_LINE_START;
-        currentInfoPanel = new VersionInfoPanel(model, PointInTimeType.CURRENT_POINT_IN_TIME);
-        add(currentInfoPanel,gc);
-
-        adjustmentSynchronizer = new AdjustmentSynchronizer();
-        selectionSynchronizer = new SelectionSynchronizer();
-
-        // ---------------------------
-        gc.gridx = 0;
-        gc.gridy = 1;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        add(embeddInScrollPane(buildReferenceTagTable()),gc);
-
-        gc.gridx = 1;
-        gc.gridy = 1;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        add(embeddInScrollPane(buildCurrentTagTable()),gc);
-    }
-
+    /**
+     * Constructs a new {@code TagInfoViewer}.
+     * @param model The history browsing model
+     */
     public TagInfoViewer(HistoryBrowserModel model) {
-        setModel(model);
-        build();
-    }
-
-    protected void unregisterAsObserver(HistoryBrowserModel model) {
-        if (currentInfoPanel != null) {
-            model.deleteObserver(currentInfoPanel);
-        }
-        if (referenceInfoPanel != null) {
-            model.deleteObserver(referenceInfoPanel);
-        }
-    }
-    protected void registerAsObserver(HistoryBrowserModel model) {
-        if (currentInfoPanel != null) {
-            model.addObserver(currentInfoPanel);
-        }
-        if (referenceInfoPanel != null) {
-            model.addObserver(referenceInfoPanel);
-        }
-    }
-
-    public void setModel(HistoryBrowserModel model) {
-        if (this.model != null) {
-            unregisterAsObserver(model);
-        }
-        this.model = model;
-        if (this.model != null) {
-            registerAsObserver(model);
-        }
+        super(model);
     }
 }
