Index: unk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeColumnModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeColumnModel.java	(revision 9846)
+++ 	(revision )
@@ -1,34 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.tags;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import javax.swing.table.DefaultTableColumnModel;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.table.TableColumn;
-
-public class TagMergeColumnModel extends DefaultTableColumnModel {
-
-    protected final void createColumns(TableCellRenderer renderer) {
-
-        TableColumn col = null;
-
-        // column 0 - Key
-        col = new TableColumn(0);
-        col.setHeaderValue(tr("Key"));
-        col.setResizable(true);
-        col.setCellRenderer(renderer);
-        addColumn(col);
-
-        // column 1 - Value
-        col = new TableColumn(1);
-        col.setHeaderValue(tr("Value"));
-        col.setResizable(true);
-        col.setCellRenderer(renderer);
-        addColumn(col);
-    }
-
-    public TagMergeColumnModel(TableCellRenderer renderer) {
-        createColumns(renderer);
-    }
-}
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java	(revision 9846)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java	(revision 9847)
@@ -31,4 +31,5 @@
 import org.openstreetmap.josm.gui.conflict.pair.IConflictResolver;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+import org.openstreetmap.josm.gui.tagging.TagTableColumnModelBuilder;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -43,4 +44,5 @@
     private JTable theirTable;
     private final TagMergeModel model;
+    private final String[] keyvalue;
     private transient AdjustmentSynchronizer adjustmentSynchronizer;
 
@@ -50,4 +52,5 @@
     public TagMerger() {
         model = new TagMergeModel();
+        keyvalue = new String[]{tr("Key"), tr("Value")};
         build();
     }
@@ -71,10 +74,5 @@
      */
     protected JScrollPane buildMineTagTable() {
-        mineTable = new JTable(
-                model,
-                new TagMergeColumnModel(
-                        new MineTableCellRenderer()
-                )
-        );
+        mineTable = new JTable(model, new TagTableColumnModelBuilder(new MineTableCellRenderer(), keyvalue).build());
         mineTable.setName("table.my");
         return embeddInScrollPane(mineTable);
@@ -87,10 +85,5 @@
      */
     protected JScrollPane buildTheirTable() {
-        theirTable = new JTable(
-                model,
-                new TagMergeColumnModel(
-                        new TheirTableCellRenderer()
-                )
-        );
+        theirTable = new JTable(model, new TagTableColumnModelBuilder(new TheirTableCellRenderer(), keyvalue).build());
         theirTable.setName("table.their");
         return embeddInScrollPane(theirTable);
@@ -104,10 +97,5 @@
 
     protected JScrollPane buildMergedTable() {
-        mergedTable = new JTable(
-                model,
-                new TagMergeColumnModel(
-                        new MergedTableCellRenderer()
-                )
-        );
+        mergedTable = new JTable(model, new TagTableColumnModelBuilder(new MergedTableCellRenderer(), keyvalue).build());
         mergedTable.setName("table.merged");
         return embeddInScrollPane(mergedTable);
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java	(revision 9846)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java	(revision 9847)
@@ -33,12 +33,11 @@
 import javax.swing.JTable;
 import javax.swing.UIManager;
-import javax.swing.table.DefaultTableColumnModel;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.TableCellRenderer;
-import javax.swing.table.TableColumn;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.TagCollection;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.tagging.TagTableColumnModelBuilder;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.WindowGeometry;
@@ -368,32 +367,4 @@
     }
 
-    private static final class StatisticsTableColumnModel extends DefaultTableColumnModel {
-        private StatisticsTableColumnModel() {
-            TableCellRenderer renderer = new StatisticsInfoRenderer();
-            TableColumn col = null;
-
-            // column 0 - Paste
-            col = new TableColumn(0);
-            col.setHeaderValue(tr("Paste ..."));
-            col.setResizable(true);
-            col.setCellRenderer(renderer);
-            addColumn(col);
-
-            // column 1 - From
-            col = new TableColumn(1);
-            col.setHeaderValue(tr("From ..."));
-            col.setResizable(true);
-            col.setCellRenderer(renderer);
-            addColumn(col);
-
-            // column 2 - To
-            col = new TableColumn(2);
-            col.setHeaderValue(tr("To ..."));
-            col.setResizable(true);
-            col.setCellRenderer(renderer);
-            addColumn(col);
-        }
-    }
-
     private static final class StatisticsTableModel extends DefaultTableModel {
         private static final String[] HEADERS = new String[] {tr("Paste ..."), tr("From ..."), tr("To ...") };
@@ -510,5 +481,6 @@
 
         private StatisticsInfoTable(StatisticsTableModel model) {
-            JTable infoTable = new JTable(model, new StatisticsTableColumnModel());
+            JTable infoTable = new JTable(model,
+                    new TagTableColumnModelBuilder(new StatisticsInfoRenderer(), tr("Paste ..."), tr("From ..."), tr("To ...")).build());
             infoTable.setShowHorizontalLines(true);
             infoTable.setShowVerticalLines(false);
Index: unk/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolverColumnModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolverColumnModel.java	(revision 9846)
+++ 	(revision )
@@ -1,48 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.tags;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import javax.swing.table.DefaultTableColumnModel;
-import javax.swing.table.TableColumn;
-
-public class TagConflictResolverColumnModel extends DefaultTableColumnModel {
-
-    protected final void createColumns() {
-        TableColumn col = null;
-        MultiValueCellRenderer renderer = new MultiValueCellRenderer();
-        MultiValueCellEditor editor = new MultiValueCellEditor();
-
-        // column 0 - State
-        col = new TableColumn(0);
-        col.setHeaderValue("");
-        col.setResizable(true);
-        col.setWidth(20);
-        col.setPreferredWidth(20);
-        col.setMaxWidth(30);
-        col.setCellRenderer(renderer);
-        addColumn(col);
-
-        // column 1 - Key
-        col = new TableColumn(1);
-        col.setHeaderValue(tr("Key"));
-        col.setResizable(true);
-        col.setCellRenderer(renderer);
-        addColumn(col);
-
-        // column 2 - Value
-        col = new TableColumn(2);
-        col.setHeaderValue(tr("Value"));
-        col.setResizable(true);
-        col.setCellRenderer(renderer);
-        col.setCellEditor(editor);
-        addColumn(col);
-    }
-
-    /**
-     * Constructs a new {@code TagConflictResolverColumnModel}.
-     */
-    public TagConflictResolverColumnModel() {
-        createColumns();
-    }
-}
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolverTable.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolverTable.java	(revision 9846)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolverTable.java	(revision 9847)
@@ -1,8 +1,11 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.conflict.tags;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
 
+import org.openstreetmap.josm.gui.tagging.TagTableColumnModelBuilder;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.gui.widgets.JosmTable;
@@ -15,5 +18,7 @@
      */
     public TagConflictResolverTable(TagConflictResolverModel model) {
-        super(model, new TagConflictResolverColumnModel());
+        super(model, new TagTableColumnModelBuilder(new MultiValueCellRenderer(), "", tr("Key"), tr("Value"))
+                .setWidth(20, 0).setPreferredWidth(20, 0).setMaxWidth(30, 0)
+                .setCellEditor(new MultiValueCellEditor(), 2).build());
 
         setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TagTable.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TagTable.java	(revision 9846)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TagTable.java	(revision 9847)
@@ -24,5 +24,4 @@
 import javax.swing.AbstractAction;
 import javax.swing.CellEditor;
-import javax.swing.DefaultListSelectionModel;
 import javax.swing.JComponent;
 import javax.swing.JTable;
@@ -33,6 +32,4 @@
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
-import javax.swing.table.DefaultTableColumnModel;
-import javax.swing.table.TableColumn;
 import javax.swing.text.JTextComponent;
 
@@ -53,5 +50,5 @@
 /**
  * This is the tabular editor component for OSM tags.
- *
+ * @since 1762
  */
 public class TagTable extends JTable  {
@@ -66,31 +63,4 @@
     private final CopyOnWriteArrayList<Component> doNotStopCellEditingWhenFocused = new CopyOnWriteArrayList<>();
     private transient CellEditorRemover editorRemover;
-
-    /**
-     * The table has two columns. The first column is used for editing rendering and
-     * editing tag keys, the second for rendering and editing tag values.
-     *
-     */
-    static class TagTableColumnModel extends DefaultTableColumnModel {
-        TagTableColumnModel(DefaultListSelectionModel selectionModel) {
-            setSelectionModel(selectionModel);
-            TableColumn col = null;
-            TagCellRenderer renderer = new TagCellRenderer();
-
-            // column 0 - tag key
-            col = new TableColumn(0);
-            col.setHeaderValue(tr("Key"));
-            col.setResizable(true);
-            col.setCellRenderer(renderer);
-            addColumn(col);
-
-            // column 1 - tag value
-            col = new TableColumn(1);
-            col.setHeaderValue(tr("Value"));
-            col.setResizable(true);
-            col.setCellRenderer(renderer);
-            addColumn(col);
-        }
-    }
 
     /**
@@ -437,5 +407,7 @@
      */
     public TagTable(TagEditorModel model, final int maxCharacters) {
-        super(model, new TagTableColumnModel(model.getColumnSelectionModel()), model.getRowSelectionModel());
+        super(model, new TagTableColumnModelBuilder(new TagCellRenderer(), tr("Key"), tr("Value"))
+                  .setSelectionModel(model.getColumnSelectionModel()).build(),
+              model.getRowSelectionModel());
         this.model = model;
         init(maxCharacters);
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TagTableColumnModelBuilder.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TagTableColumnModelBuilder.java	(revision 9847)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TagTableColumnModelBuilder.java	(revision 9847)
@@ -0,0 +1,113 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging;
+
+import javax.swing.ListSelectionModel;
+import javax.swing.table.DefaultTableColumnModel;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
+
+import org.openstreetmap.josm.tools.CheckParameterUtil;
+
+/**
+ * Builder class allowing to construct customized tag table column models.
+ * All columns are resizable and share the same renderer.
+ * @since 9847
+ */
+public class TagTableColumnModelBuilder {
+
+    private final DefaultTableColumnModel model = new DefaultTableColumnModel();
+
+    /**
+     * Construct a new {@code TagTableColumnModelBuilder}.
+     * @param renderer rendered used for all columns
+     * @param headerValues header values of each column, determining the number of columns
+     * @see TableColumn#setHeaderValue
+     * @see TableColumn#setCellRenderer
+     */
+    public TagTableColumnModelBuilder(TableCellRenderer renderer, String ... headerValues) {
+        CheckParameterUtil.ensureParameterNotNull(headerValues, "headerValues");
+        for (int i = 0; i < headerValues.length; i++) {
+            TableColumn col = new TableColumn(i);
+            col.setHeaderValue(headerValues[i]);
+            col.setResizable(true);
+            col.setCellRenderer(renderer);
+            model.addColumn(col);
+        }
+    }
+
+    /**
+     * Sets width of specified columns.
+     * @param width the new width
+     * @param indexes indexes of columns to setup
+     * @return {@code this}
+     * @see TableColumn#setWidth
+     */
+    public TagTableColumnModelBuilder setWidth(int width, int ... indexes) {
+        for (int i : indexes) {
+            model.getColumn(i).setWidth(width);
+        }
+        return this;
+    }
+
+    /**
+     * Sets preferred width of specified columns.
+     * @param width the new width
+     * @param indexes indexes of columns to setup
+     * @return {@code this}
+     * @see TableColumn#setPreferredWidth
+     */
+    public TagTableColumnModelBuilder setPreferredWidth(int width, int ... indexes) {
+        for (int i : indexes) {
+            model.getColumn(i).setPreferredWidth(width);
+        }
+        return this;
+    }
+
+    /**
+     * Sets max width of specified columns.
+     * @param width the new width
+     * @param indexes indexes of columns to setup
+     * @return {@code this}
+     * @see TableColumn#setMaxWidth
+     */
+    public TagTableColumnModelBuilder setMaxWidth(int width, int ... indexes) {
+        for (int i : indexes) {
+            model.getColumn(i).setMaxWidth(width);
+        }
+        return this;
+    }
+
+    /**
+     * Sets cell editor of specified columns.
+     * @param editor the new cell editor
+     * @param indexes indexes of columns to setup
+     * @return {@code this}
+     * @see TableColumn#setCellEditor
+     */
+    public TagTableColumnModelBuilder setCellEditor(TableCellEditor editor, int ... indexes) {
+        for (int i : indexes) {
+            model.getColumn(i).setCellEditor(editor);
+        }
+        return this;
+    }
+
+    /**
+     * Sets selection model.
+     * @param selectionModel new selection model
+     * @return {@code this}
+     * @see DefaultTableColumnModel#setSelectionModel
+     */
+    public TagTableColumnModelBuilder setSelectionModel(ListSelectionModel selectionModel) {
+        model.setSelectionModel(selectionModel);
+        return this;
+    }
+
+    /**
+     * Returns the new tag table column model.
+     * @return the new tag table column model
+     */
+    public DefaultTableColumnModel build() {
+        return model;
+    }
+}
