Index: trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java	(revision 6826)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java	(revision 6827)
@@ -390,4 +390,5 @@
                 this.url = url;
             } catch(Exception e) {
+                Main.warn(e);
                 HelpAwareOptionPane.showOptionDialog(
                         Main.parent,
Index: trunk/src/org/openstreetmap/josm/gui/history/PointInTimeType.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/PointInTimeType.java	(revision 6826)
+++ trunk/src/org/openstreetmap/josm/gui/history/PointInTimeType.java	(revision 6827)
@@ -14,4 +14,8 @@
     CURRENT_POINT_IN_TIME;
 
+    /**
+     * Returns the opposite point in time.
+     * @return the opposite point in time
+     */
     public PointInTimeType opposite() {
         if (this.equals(REFERENCE_POINT_IN_TIME))
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 6826)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 6827)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AbstractInfoAction;
+import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
@@ -41,4 +42,15 @@
     private UrlLabel lblChangeset;
     private JTextArea lblChangesetComment;
+    private JTextArea lblChangesetSource;
+
+    protected static JTextArea buildTextArea(String tooltip) {
+        JTextArea lbl = new JTextArea();
+        lbl.setLineWrap(true);
+        lbl.setWrapStyleWord(true);
+        lbl.setEditable(false);
+        lbl.setOpaque(false);
+        lbl.setToolTipText(tooltip);
+        return lbl;
+    }
 
     protected void build() {
@@ -57,9 +69,6 @@
         pnlUserAndChangeset.add(lblChangeset);
 
-        lblChangesetComment = new JTextArea();
-        lblChangesetComment.setLineWrap(true);
-        lblChangesetComment.setWrapStyleWord(true);
-        lblChangesetComment.setEditable(false);
-        lblChangesetComment.setOpaque(false);
+        lblChangesetComment = buildTextArea(tr("Changeset comment"));
+        lblChangesetSource = buildTextArea(tr("Changeset source"));
 
         setLayout(new GridBagLayout());
@@ -75,4 +84,6 @@
         gc.gridy = 2;
         add(lblChangesetComment, gc);
+        gc.gridy = 3;
+        add(lblChangesetSource, gc);
     }
 
@@ -134,20 +145,29 @@
     }
 
+    protected static String getUserUrl(String username) throws UnsupportedEncodingException {
+        return AbstractInfoAction.getBaseUserUrl() + "/" +  URLEncoder.encode(username, "UTF-8").replaceAll("\\+", "%20");
+    }
+
     @Override
     public void update(Observable o, Object arg) {
         lblInfo.setText(getInfoText());
 
-        if (!model.isLatest(getPrimitive())) {
-            String url = AbstractInfoAction.getBaseBrowseUrl() + "/changeset/" + getPrimitive().getChangesetId();
+        HistoryOsmPrimitive primitive = getPrimitive();
+        Changeset cs = primitive.getChangeset();
+
+        if (!model.isLatest(primitive)) {
+            User user = primitive.getUser();
+            String url = AbstractInfoAction.getBaseBrowseUrl() + "/changeset/" + primitive.getChangesetId();
             lblChangeset.setUrl(url);
-            lblChangeset.setDescription(Long.toString(getPrimitive().getChangesetId()));
-            final String comment = getPrimitive().getChangeset() != null ? getPrimitive().getChangeset().get("comment") : null;
-            lblChangesetComment.setText(comment);
-            lblChangesetComment.setToolTipText(tr("Changeset comment"));
-
+            lblChangeset.setDescription(Long.toString(primitive.getChangesetId()));
+
+            String username = "";
+            if (user != null) {
+                username = user.getName();
+            }
+            lblUser.setDescription(username);
             try {
-                if (getPrimitive().getUser() != null && getPrimitive().getUser() != User.getAnonymous()) {
-                    url = AbstractInfoAction.getBaseUserUrl() + "/" +  URLEncoder.encode(getPrimitive().getUser().getName(), "UTF-8").replaceAll("\\+", "%20");
-                    lblUser.setUrl(url);
+                if (user != null && user != User.getAnonymous()) {
+                    lblUser.setUrl(getUserUrl(username));
                 } else {
                     lblUser.setUrl(null);
@@ -157,27 +177,31 @@
                 lblUser.setUrl(null);
             }
-            String username = "";
-            if (getPrimitive().getUser() != null) {
-                username = getPrimitive().getUser().getName();
-            }
-            lblUser.setDescription(username);
         } else {
-            String user = JosmUserIdentityManager.getInstance().getUserName();
-            if (user == null) {
+            String username = JosmUserIdentityManager.getInstance().getUserName();
+            if (username == null) {
                 lblUser.setDescription(tr("anonymous"));
                 lblUser.setUrl(null);
             } else {
+                lblUser.setDescription(username);
                 try {
-                    String url = AbstractInfoAction.getBaseUserUrl() + "/" +  URLEncoder.encode(user, "UTF-8").replaceAll("\\+", "%20");
-                    lblUser.setUrl(url);
+                    lblUser.setUrl(getUserUrl(username));
                 } catch(UnsupportedEncodingException e) {
                     Main.error(e);
                     lblUser.setUrl(null);
                 }
-                lblUser.setDescription(user);
             }
             lblChangeset.setDescription(tr("none"));
             lblChangeset.setUrl(null);
         }
+
+        final String comment = cs != null ? cs.get("comment") : null;
+        final String source = cs != null ? cs.get("source") : null;
+        lblChangesetComment.setText(comment);
+        lblChangesetSource.setText(source);
+
+        // Hide comment / source if both values are empty
+        final Changeset oppCs = model.getPointInTime(pointInTimeType.opposite()).getChangeset();
+        lblChangesetComment.setVisible(comment != null || (oppCs != null && oppCs.get("comment") != null));
+        lblChangesetSource.setVisible(source != null || (oppCs != null && oppCs.get("source") != null));
     }
 }
