Index: /trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 6418)
+++ /trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 6419)
@@ -342,4 +342,13 @@
 
     /**
+     * Returns the current value for the changeset source
+     *
+     * @return the current value for the changeset source
+     */
+    protected String getUploadSource() {
+        return changesetSourceModel.getComment();
+    }
+
+    /**
      * Returns true if the dialog was canceled
      *
@@ -402,12 +411,10 @@
 
         /**
-         * returns true if the user wants to revisit, false if they
-         * want to continue
+         * Displays a warning message indicating that the upload comment is empty/short.
+         * @return true if the user wants to revisit, false if they want to continue
          */
         protected boolean warnUploadComment() {
-            ExtendedDialog dlg = new ExtendedDialog(UploadDialog.this,
+            return warnUploadTag(
                     tr("Please revise upload comment"),
-                    new String[] {tr("Revise"), tr("Cancel"), tr("Continue as is")});
-            dlg.setContent("<html>" +
                     tr("Your upload comment is <i>empty</i>, or <i>very short</i>.<br /><br />" +
                             "This is technically allowed, but please consider that many users who are<br />" +
@@ -415,6 +422,30 @@
                             "to understand what is going on!<br /><br />" +
                             "If you spend a minute now to explain your change, you will make life<br />" +
-                    "easier for many other mappers.") +
-            "</html>");
+                            "easier for many other mappers."),
+                    "upload_comment_is_empty_or_very_short"
+            );
+        }
+
+        /**
+         * Displays a warning message indicating that no changeset source is given.
+         * @return true if the user wants to revisit, false if they want to continue
+         */
+        protected boolean warnUploadSource() {
+            return warnUploadTag(
+                    tr("Please revise specify a changeset source"),
+                    tr("You did not specify a source for your changes.<br />" +
+                            "This is technically allowed, but it assists other users <br />" +
+                            "to understand the origins of the data.<br /><br />" +
+                            "If you spend a minute now to explain your change, you will make life<br />" +
+                            "easier for many other mappers."),
+                    "upload_source_is_empty"
+            );
+        }
+
+        protected boolean warnUploadTag(final String title, final String message, final String togglePref) {
+            ExtendedDialog dlg = new ExtendedDialog(UploadDialog.this,
+                    title,
+                    new String[] {tr("Revise"), tr("Cancel"), tr("Continue as is")});
+            dlg.setContent("<html>" + message + "</html>");
             dlg.setButtonIcons(new Icon[] {
                     ImageProvider.get("ok"),
@@ -429,5 +460,5 @@
                     tr("Ignore this hint and upload anyway")});
             dlg.setIcon(JOptionPane.WARNING_MESSAGE);
-            dlg.toggleEnable("upload_comment_is_empty_or_very_short");
+            dlg.toggleEnable(togglePref);
             dlg.setToggleCheckboxText(tr("Do not show this message again"));
             dlg.setCancelButton(1, 2);
@@ -447,11 +478,10 @@
         @Override
         public void actionPerformed(ActionEvent e) {
-            if (getUploadComment().trim().length() < 10) {
-                if (warnUploadComment())
-                {
-                    tpConfigPanels.setSelectedIndex(0);
-                    pnlBasicUploadSettings.initEditingOfUploadComment();
-                    return;
-                }
+            if ((getUploadComment().trim().length() < 10 && warnUploadComment()) /* abort for missing comment */
+                    || (getUploadSource().trim().isEmpty() && warnUploadSource()) /* abort for missing changeset source */
+                    ) {
+                tpConfigPanels.setSelectedIndex(0);
+                pnlBasicUploadSettings.initEditingOfUploadComment();
+                return;
             }
 
@@ -460,6 +490,8 @@
             List<String> emptyChangesetTags = new ArrayList<String>();
             for (final Entry<String, String> i : pnlTagSettings.getTags(true).entrySet()) {
-                if ((i.getKey() == null || i.getKey().trim().isEmpty())
-                        ^ (i.getValue() == null || i.getValue().trim().isEmpty())) {
+                final boolean isKeyEmpty = i.getKey() == null || i.getKey().trim().isEmpty();
+                final boolean isValueEmpty = i.getValue() == null || i.getValue().trim().isEmpty();
+                final boolean ignoreKey = "comment".equals(i.getKey()) || "source".equals(i.getKey());
+                if ((isKeyEmpty ^ isValueEmpty) && !ignoreKey) {
                     emptyChangesetTags.add(tr("{0}={1}", i.getKey(), i.getValue()));
                 }
