Index: trunk/src/org/openstreetmap/josm/data/osm/Changeset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Changeset.java	(revision 7714)
+++ trunk/src/org/openstreetmap/josm/data/osm/Changeset.java	(revision 7715)
@@ -315,4 +315,5 @@
         this.tags = new HashMap<>(other.tags);
         this.incomplete = other.incomplete;
+        this.discussion = other.discussion != null ? new ArrayList<>(other.discussion) : null;
 
         // FIXME: merging of content required?
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/AbstractCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/AbstractCellRenderer.java	(revision 7715)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/AbstractCellRenderer.java	(revision 7715)
@@ -0,0 +1,74 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Font;
+import java.text.DateFormat;
+import java.util.Date;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.UIManager;
+import javax.swing.table.TableCellRenderer;
+
+import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.tools.date.DateUtils;
+
+/**
+ * Superclass of changeset cell renderers.
+ * @since 7715
+ */
+public abstract class AbstractCellRenderer extends JLabel implements TableCellRenderer {
+
+    protected void reset(JComponent c) {
+        c.setBackground(UIManager.getColor("Table.background"));
+        c.setForeground(UIManager.getColor("Table.foreground"));
+        c.setFont(UIManager.getFont("Table.font"));
+        c.setToolTipText(null);
+        c.setOpaque(true);
+    }
+
+    protected void reset() {
+        reset(this);
+    }
+
+    protected void renderColors(JComponent c, boolean isSelected) {
+        if (isSelected) {
+            c.setBackground(UIManager.getColor("Table.selectionBackground"));
+            c.setForeground(UIManager.getColor("Table.selectionForeground"));
+        } else {
+            c.setBackground(UIManager.getColor("Table.background"));
+            c.setForeground(UIManager.getColor("Table.foreground"));
+        }
+    }
+
+    protected void renderColors(boolean isSelected) {
+        renderColors(this, isSelected);
+    }
+
+    protected void renderId(long id) {
+        setText(Long.toString(id));
+        setToolTipText(null);
+    }
+
+    protected void renderUser(User user) {
+        if (user == null || user.getName().trim().isEmpty()) {
+            setFont(UIManager.getFont("Table.font").deriveFont(Font.ITALIC));
+            setText(tr("anonymous"));
+        } else {
+            setFont(UIManager.getFont("Table.font"));
+            setText(user.getName());
+            setToolTipText(user.getName());
+        }
+    }
+
+    protected void renderDate(Date d) {
+        if (d == null) {
+            setText("");
+        } else {
+            setText(DateUtils.formatDateTime(d, DateFormat.SHORT, DateFormat.SHORT));
+        }
+        setToolTipText(null);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableCellRenderer.java	(revision 7714)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableCellRenderer.java	(revision 7715)
@@ -2,20 +2,13 @@
 package org.openstreetmap.josm.gui.dialogs.changeset;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.I18n.trc;
 
 import java.awt.Component;
 import java.awt.Font;
-import java.text.DateFormat;
-import java.util.Date;
 
-import javax.swing.JLabel;
 import javax.swing.JTable;
 import javax.swing.UIManager;
-import javax.swing.table.TableCellRenderer;
 
 import org.openstreetmap.josm.data.osm.Changeset;
-import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -23,34 +16,5 @@
  * @since 2689
  */
-public class ChangesetCacheTableCellRenderer extends JLabel implements TableCellRenderer{
-
-    /**
-     * Constructs a new {@code ChangesetCacheTableCellRenderer}.
-     */
-    public ChangesetCacheTableCellRenderer() {
-        setOpaque(true);
-    }
-
-    protected void reset() {
-        setBackground(UIManager.getColor("Table.background"));
-        setForeground(UIManager.getColor("Table.foreground"));
-        setFont(UIManager.getFont("Table.font"));
-        setToolTipText(null);
-    }
-
-    protected void renderColors(boolean isSelected) {
-        if (isSelected) {
-            setBackground(UIManager.getColor("Table.selectionBackground"));
-            setForeground(UIManager.getColor("Table.selectionForeground"));
-        } else {
-            setBackground(UIManager.getColor("Table.background"));
-            setForeground(UIManager.getColor("Table.foreground"));
-        }
-    }
-
-    protected void renderId(Changeset cs) {
-        setText(Integer.toString(cs.getId()));
-        setToolTipText(null);
-    }
+public class ChangesetCacheTableCellRenderer extends AbstractCellRenderer {
 
     protected void renderUploadComment(Changeset cs) {
@@ -75,25 +39,4 @@
     }
 
-    protected void renderUser(Changeset cs) {
-        User user = cs.getUser();
-        if (user == null || user.getName().trim().isEmpty()) {
-            setFont(UIManager.getFont("Table.font").deriveFont(Font.ITALIC));
-            setText(tr("anonymous"));
-        } else {
-            setFont(UIManager.getFont("Table.font"));
-            setText(user.getName());
-            setToolTipText(user.getName());
-        }
-    }
-
-    protected void renderDate(Date d) {
-        if (d == null) {
-            setText("");
-        } else {
-            setText(DateUtils.formatDateTime(d, DateFormat.SHORT, DateFormat.SHORT));
-        }
-        setToolTipText(null);
-    }
-
     protected void renderDiscussions(Changeset cs) {
         setText(Integer.toString(cs.getCommentsCount()));
@@ -110,8 +53,8 @@
         Changeset cs = (Changeset)value;
         switch(column) {
-        case 0: /* id */ renderId(cs); break;
+        case 0: /* id */ renderId(cs.getId()); break;
         case 1: /* upload comment */ renderUploadComment(cs); break;
         case 2: /* open/closed */ renderOpen(cs); break;
-        case 3: /* user */ renderUser(cs); break;
+        case 3: /* user */ renderUser(cs.getUser()); break;
         case 4: /* created at */ renderDate(cs.getCreatedAt()); break;
         case 5: /* closed at */ renderDate(cs.getClosedAt()); break;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableCellRenderer.java	(revision 7714)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableCellRenderer.java	(revision 7715)
@@ -6,8 +6,5 @@
 import java.awt.Component;
 
-import javax.swing.JLabel;
 import javax.swing.JTable;
-import javax.swing.UIManager;
-import javax.swing.table.TableCellRenderer;
 
 import org.openstreetmap.josm.data.osm.ChangesetDataSet.ChangesetModificationType;
@@ -17,32 +14,6 @@
  * The table cell renderer used in the changeset content table, except for the "name"
  * column in which we use a {@link org.openstreetmap.josm.gui.OsmPrimitivRenderer}.
- *
  */
-public class ChangesetContentTableCellRenderer extends JLabel implements TableCellRenderer{
-
-    public ChangesetContentTableCellRenderer() {
-        setOpaque(true);
-    }
-
-    protected void reset() {
-        setBackground(UIManager.getColor("Table.background"));
-        setForeground(UIManager.getColor("Table.foreground"));
-        setFont(UIManager.getFont("Table.font"));
-    }
-
-    protected void renderColors(boolean isSelected) {
-        if (isSelected) {
-            setBackground(UIManager.getColor("Table.selectionBackground"));
-            setForeground(UIManager.getColor("Table.selectionForeground"));
-        } else {
-            setBackground(UIManager.getColor("Table.background"));
-            setForeground(UIManager.getColor("Table.foreground"));
-        }
-    }
-
-    protected void renderId(HistoryOsmPrimitive primitive) {
-        setText(Long.toString(primitive.getId()));
-        setToolTipText(null);
-    }
+public class ChangesetContentTableCellRenderer extends AbstractCellRenderer {
 
     protected void renderModificationType(ChangesetModificationType type) {
@@ -69,5 +40,5 @@
         case 1:
             HistoryOsmPrimitive primitive = (HistoryOsmPrimitive)value;
-            renderId(primitive);
+            renderId(primitive.getId());
             break;
         default:
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableColumnModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableColumnModel.java	(revision 7714)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableColumnModel.java	(revision 7715)
@@ -46,4 +46,7 @@
     }
 
+    /**
+     * Constructs a new {@code ChangesetContentTableColumnModel}.
+     */
     public ChangesetContentTableColumnModel() {
         createColumns();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableModel.java	(revision 7714)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableModel.java	(revision 7715)
@@ -63,6 +63,5 @@
 
     /**
-     * Populates the model with the content of a model. If ds is null, the
-     * table is cleared.
+     * Populates the model with the content of a changeset. If ds is null, the table is cleared.
      *
      * @param ds the changeset content.
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java	(revision 7714)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java	(revision 7715)
@@ -5,4 +5,5 @@
 
 import java.awt.BorderLayout;
+import java.awt.Component;
 import java.awt.FlowLayout;
 import java.awt.event.ActionEvent;
@@ -14,4 +15,6 @@
 import javax.swing.BorderFactory;
 import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
 import javax.swing.JToolBar;
 
@@ -31,4 +34,8 @@
 
     private final UpdateChangesetDiscussionAction actUpdateChangesets = new UpdateChangesetDiscussionAction();
+
+    private final ChangesetDiscussionTableModel model = new ChangesetDiscussionTableModel();
+
+    private JTable table;
 
     private Changeset current = null;
@@ -95,14 +102,31 @@
         setLayout(new BorderLayout());
         setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
-        //add(buildDetailViewPanel(), BorderLayout.CENTER);
         add(buildActionButtonPanel(), BorderLayout.WEST);
+        add(buildDiscussionPanel(), BorderLayout.CENTER);
+    }
+
+    private Component buildDiscussionPanel() {
+        JPanel pnl = new JPanel(new BorderLayout());
+        table = new JTable(model, new ChangesetDiscussionTableColumnModel());
+        //tblContent.addMouseListener(new PopupMenuLauncher(new ChangesetContentTablePopupMenu()));
+        pnl.add(new JScrollPane(table), BorderLayout.CENTER);
+        return pnl;
     }
 
     protected void clearView() {
-        // TODO
+        model.populate(null);
     }
 
     protected void updateView(Changeset cs) {
-        // TODO
+        model.populate(cs.getDiscussion());
+        // Update row heights
+        for (int row = 0; row < table.getRowCount(); row++) {
+            int rowHeight = table.getRowHeight();
+
+            Component comp = table.prepareRenderer(table.getCellRenderer(row, 2), row, 2);
+            rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);
+
+            table.setRowHeight(row, rowHeight);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java	(revision 7715)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java	(revision 7715)
@@ -0,0 +1,41 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import java.awt.Component;
+import java.util.Date;
+
+import javax.swing.JComponent;
+import javax.swing.JTable;
+
+import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.gui.widgets.JosmTextArea;
+
+/**
+ * The cell renderer for the changeset dicussion table
+ * @since 7715
+ */
+public class ChangesetDiscussionTableCellRenderer extends AbstractCellRenderer {
+
+    @Override
+    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
+            int row, int column) {
+        if (value == null)
+            return this;
+        JComponent comp = this;
+        reset(comp);
+        renderColors(comp, isSelected);
+        switch(column) {
+        case 0:
+            renderDate((Date)value);
+            break;
+        case 1:
+            renderUser((User)value);
+            break;
+        case 2:
+            comp = new JosmTextArea((String) value);
+            reset(comp);
+            renderColors(comp, isSelected);
+        }
+        return comp;
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableColumnModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableColumnModel.java	(revision 7715)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableColumnModel.java	(revision 7715)
@@ -0,0 +1,48 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import javax.swing.table.DefaultTableColumnModel;
+import javax.swing.table.TableColumn;
+
+/**
+ * The column model for the changeset content
+ * @since 7715
+ */
+public class ChangesetDiscussionTableColumnModel extends DefaultTableColumnModel {
+
+    protected void createColumns() {
+        TableColumn col = null;
+        ChangesetDiscussionTableCellRenderer renderer = new ChangesetDiscussionTableCellRenderer();
+        // column 0 - Date
+        col = new TableColumn(0, 150);
+        col.setHeaderValue(tr("Date"));
+        col.setResizable(true);
+        col.setMaxWidth(200);
+        col.setCellRenderer(renderer);
+        addColumn(col);
+
+        // column 1 - User
+        col = new TableColumn(1, 150);
+        col.setHeaderValue(tr("User"));
+        col.setResizable(true);
+        col.setMaxWidth(300);
+        col.setCellRenderer(renderer);
+        addColumn(col);
+
+        // column 2 - Text
+        col = new TableColumn(2, 400);
+        col.setHeaderValue(tr("Comment"));
+        col.setResizable(true);
+        col.setCellRenderer(renderer);
+        addColumn(col);
+    }
+
+    /**
+     * Constructs a new {@code ChangesetContentTableColumnModel}.
+     */
+    public ChangesetDiscussionTableColumnModel() {
+        createColumns();
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableModel.java	(revision 7715)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableModel.java	(revision 7715)
@@ -0,0 +1,55 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.table.AbstractTableModel;
+
+import org.openstreetmap.josm.data.osm.ChangesetDiscussionComment;
+
+/**
+ * Model of changeset discussion table.
+ * @since 7715
+ */
+public class ChangesetDiscussionTableModel extends AbstractTableModel {
+
+    private final List<ChangesetDiscussionComment> data = new ArrayList<>();
+
+    @Override
+    public int getRowCount() {
+        return data.size();
+    }
+
+    @Override
+    public int getColumnCount() {
+        return 3;
+    }
+
+    @Override
+    public Object getValueAt(int rowIndex, int columnIndex) {
+        if (rowIndex < 0 || rowIndex >= data.size())
+            return null;
+        switch (columnIndex) {
+        case 0:
+            return data.get(rowIndex).getDate();
+        case 1:
+            return data.get(rowIndex).getUser();
+        default:
+            return data.get(rowIndex).getText();
+        }
+    }
+
+    /**
+     * Populates the model with the discussion of a changeset. If ds is null, the table is cleared.
+     *
+     * @param list the changeset discussion.
+     */
+    public void populate(List<ChangesetDiscussionComment> list) {
+        data.clear();
+        if (list != null) {
+            data.addAll(list);
+        }
+        fireTableDataChanged();
+    }
+}
