diff --git a/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java b/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
index 063a9bf..cd32674 100644
--- a/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
@@ -36,44 +36,41 @@ import org.openstreetmap.josm.tools.GBC;
 public class BasicUploadSettingsPanel extends JPanel {
     public static final String HISTORY_KEY = "upload.comment.history";
     public static final String HISTORY_LAST_USED_KEY = "upload.comment.last-used";
+    public static final String SOURCE_HISTORY_KEY = "upload.comment.source";
 
     /** the history combo box for the upload comment */
-    private HistoryComboBox hcbUploadComment;
+    private final HistoryComboBox hcbUploadComment = new HistoryComboBox();
+    private final HistoryComboBox hcbUploadSource = new HistoryComboBox();
     /** the panel with a summary of the upload parameters */
-    private UploadParameterSummaryPanel pnlUploadParameterSummary;
-    /** the changset comment model */
-    private ChangesetCommentModel changesetCommentModel;
+    private final UploadParameterSummaryPanel pnlUploadParameterSummary = new UploadParameterSummaryPanel();
+    /** the changeset comment model */
+    private final ChangesetCommentModel changesetCommentModel;
+    private final ChangesetCommentModel changesetSourceModel;
 
     protected JPanel buildUploadCommentPanel() {
         JPanel pnl = new JPanel();
         pnl.setLayout(new GridBagLayout());
+
         pnl.add(new JLabel(tr("Provide a brief comment for the changes you are uploading:")), GBC.eol().insets(0, 5, 10, 3));
-        hcbUploadComment = new HistoryComboBox();
         hcbUploadComment.setToolTipText(tr("Enter an upload comment"));
         hcbUploadComment.setMaxTextLength(Changeset.MAX_COMMENT_LENGTH);
         List<String> cmtHistory = new LinkedList<String>(Main.pref.getCollection(HISTORY_KEY, new LinkedList<String>()));
-        // we have to reverse the history, because ComboBoxHistory will reverse it again
-        // in addElement()
-        //
-        Collections.reverse(cmtHistory);
+        Collections.reverse(cmtHistory); // we have to reverse the history, because ComboBoxHistory will reverse it again in addElement()
         hcbUploadComment.setPossibleItems(cmtHistory);
-        hcbUploadComment.getEditor().addActionListener(
-                new ActionListener() {
-                    @Override
-                    public void actionPerformed(ActionEvent e) {
-                        changesetCommentModel.setComment(hcbUploadComment.getText());
-                    }
-                }
-        );
-        hcbUploadComment.getEditor().getEditorComponent().addFocusListener(
-                new FocusAdapter() {
-                    @Override
-                    public void focusLost(FocusEvent e) {
-                        changesetCommentModel.setComment(hcbUploadComment.getText());
-                    }
-                }
-        );
+        final CommentModelListener commentModelListener = new CommentModelListener(hcbUploadComment, changesetCommentModel);
+        hcbUploadComment.getEditor().addActionListener(commentModelListener);
+        hcbUploadComment.getEditor().getEditorComponent().addFocusListener(commentModelListener);
         pnl.add(hcbUploadComment, GBC.eol().fill(GBC.HORIZONTAL));
+
+        pnl.add(new JLabel(tr("List the data source for the changes:")), GBC.eol().insets(0, 8, 10, 3));
+        hcbUploadSource.setToolTipText(tr("Enter a source"));
+        List<String> sourceHistory = new LinkedList<String>(Main.pref.getCollection(SOURCE_HISTORY_KEY, new LinkedList<String>()));
+        Collections.reverse(sourceHistory); // we have to reverse the history, because ComboBoxHistory will reverse it again in addElement()
+        hcbUploadComment.setPossibleItems(sourceHistory);
+        final CommentModelListener sourceModelListener = new CommentModelListener(hcbUploadSource, changesetSourceModel);
+        hcbUploadSource.getEditor().addActionListener(sourceModelListener);
+        hcbUploadSource.getEditor().getEditorComponent().addFocusListener(sourceModelListener);
+        pnl.add(hcbUploadSource, GBC.eol().fill(GBC.HORIZONTAL));
         return pnl;
     }
 
@@ -81,19 +78,23 @@ public class BasicUploadSettingsPanel extends JPanel {
         setLayout(new BorderLayout());
         setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
         add(buildUploadCommentPanel(), BorderLayout.NORTH);
-        add(pnlUploadParameterSummary = new UploadParameterSummaryPanel(), BorderLayout.CENTER);
+        add(pnlUploadParameterSummary, BorderLayout.CENTER);
     }
 
     /**
      * Creates the panel
      *
      * @param changesetCommentModel the model for the changeset comment. Must not be null
+     * @param changesetSourceModel the model for the changeset source. Must not be null.
      * @throws IllegalArgumentException thrown if {@code changesetCommentModel} is null
      */
-    public BasicUploadSettingsPanel(ChangesetCommentModel changesetCommentModel) {
+    public BasicUploadSettingsPanel(ChangesetCommentModel changesetCommentModel, ChangesetCommentModel changesetSourceModel) {
         CheckParameterUtil.ensureParameterNotNull(changesetCommentModel, "changesetCommentModel");
+        CheckParameterUtil.ensureParameterNotNull(changesetSourceModel, "changesetSourceModel");
         this.changesetCommentModel = changesetCommentModel;
-        changesetCommentModel.addObserver(new ChangesetCommentObserver());
+        this.changesetSourceModel = changesetSourceModel;
+        changesetCommentModel.addObserver(new ChangesetCommentObserver(hcbUploadComment));
+        changesetSourceModel.addObserver(new ChangesetCommentObserver(hcbUploadSource));
         build();
     }
 
@@ -124,6 +125,9 @@ public class BasicUploadSettingsPanel extends JPanel {
         hcbUploadComment.addCurrentItemToHistory();
         Main.pref.putCollection(HISTORY_KEY, hcbUploadComment.getHistory());
         Main.pref.putInteger(HISTORY_LAST_USED_KEY, (int) (System.currentTimeMillis() / 1000));
+        // store the history of sources
+        hcbUploadSource.addCurrentItemToHistory();
+        Main.pref.putCollection(SOURCE_HISTORY_KEY, hcbUploadSource.getHistory());
     }
 
     /**
@@ -150,16 +154,46 @@ public class BasicUploadSettingsPanel extends JPanel {
     }
 
     /**
+     * Updates the changeset comment model upon changes in the input field.
+     */
+    class CommentModelListener extends FocusAdapter implements ActionListener {
+
+        final HistoryComboBox source;
+        final ChangesetCommentModel destination;
+
+        CommentModelListener(HistoryComboBox source, ChangesetCommentModel destination) {
+            this.source = source;
+            this.destination = destination;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            destination.setComment(source.getText());
+        }
+        @Override
+        public void focusLost(FocusEvent e) {
+            destination.setComment(source.getText());
+        }
+    }
+
+    /**
      * Observes the changeset comment model and keeps the comment input field
      * in sync with the current changeset comment
      */
     class ChangesetCommentObserver implements Observer {
+
+        private final HistoryComboBox destination;
+
+        ChangesetCommentObserver(HistoryComboBox destination) {
+            this.destination = destination;
+        }
+
         @Override
         public void update(Observable o, Object arg) {
             if (!(o instanceof ChangesetCommentModel)) return;
             String newComment = (String)arg;
-            if (!hcbUploadComment.getText().equals(newComment)) {
-                hcbUploadComment.setText(newComment);
+            if (!destination.getText().equals(newComment)) {
+                destination.setText(newComment);
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java b/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
index 3069851..9a97e53 100644
--- a/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
@@ -21,61 +21,66 @@ import org.openstreetmap.josm.tools.CheckParameterUtil;
 public class TagSettingsPanel extends JPanel implements TableModelListener {
 
     /** checkbox for selecting whether an atomic upload is to be used  */
-    private TagEditorPanel pnlTagEditor;
+    private final TagEditorPanel pnlTagEditor = new TagEditorPanel(null);
     /** the model for the changeset comment */
-    private ChangesetCommentModel changesetCommentModel;
+    private final ChangesetCommentModel changesetCommentModel;
+    private final ChangesetCommentModel changesetSourceModel;
     /** tags that applied to uploaded changesets by default*/
-    private Map<String, String> defaultTags = new HashMap<String, String>();
+    private final Map<String, String> defaultTags = new HashMap<String, String>();
 
     protected void build() {
         setLayout(new BorderLayout());
-        add(pnlTagEditor = new TagEditorPanel(null), BorderLayout.CENTER);
+        add(pnlTagEditor, BorderLayout.CENTER);
     }
 
     /**
      * Creates a new panel
      *
      * @param changesetCommentModel the changeset comment model. Must not be null.
+     * @param changesetSourceModel the changeset source model. Must not be null.
      * @throws IllegalArgumentException thrown if {@code changesetCommentModel} is null
      */
-    public TagSettingsPanel(ChangesetCommentModel changesetCommentModel) throws IllegalArgumentException{
+    public TagSettingsPanel(ChangesetCommentModel changesetCommentModel, ChangesetCommentModel changesetSourceModel) throws IllegalArgumentException{
         CheckParameterUtil.ensureParameterNotNull(changesetCommentModel, "changesetCommentModel");
+        CheckParameterUtil.ensureParameterNotNull(changesetSourceModel, "changesetSourceModel");
         this.changesetCommentModel = changesetCommentModel;
-        this.changesetCommentModel.addObserver(new ChangesetCommentObserver());
+        this.changesetSourceModel = changesetSourceModel;
+        this.changesetCommentModel.addObserver(new ChangesetCommentObserver("comment"));
+        this.changesetSourceModel.addObserver(new ChangesetCommentObserver("source"));
         build();
         pnlTagEditor.getModel().addTableModelListener(this);
     }
 
-    protected void setUploadComment(String comment) {
-        if (comment == null) {
-            comment = "";
+    protected void setProperty(String key, String value) {
+        if (value == null) {
+            value = "";
         }
-        comment  = comment.trim();
-        String commentInTag = getUploadComment();
-        if (comment.equals(commentInTag))
+        value = value.trim();
+        String commentInTag = getTagEditorValue(key);
+        if (value.equals(commentInTag))
             return;
 
-        if (comment.isEmpty()) {
-            pnlTagEditor.getModel().delete("comment");
+        if (value.isEmpty()) {
+            pnlTagEditor.getModel().delete(key);
             return;
         }
-        TagModel tag = pnlTagEditor.getModel().get("comment");
+        TagModel tag = pnlTagEditor.getModel().get(key);
         if (tag == null) {
-            tag = new TagModel("comment", comment);
+            tag = new TagModel(key, value);
             pnlTagEditor.getModel().add(tag);
         } else {
-            pnlTagEditor.getModel().updateTagValue(tag, comment);
+            pnlTagEditor.getModel().updateTagValue(tag, value);
         }
     }
 
-    protected String getUploadComment() {
-        TagModel tag = pnlTagEditor.getModel().get("comment");
+    protected String getTagEditorValue(String key) {
+        TagModel tag = pnlTagEditor.getModel().get(key);
         if (tag == null) return null;
         return tag.getValue();
     }
 
     public void initFromChangeset(Changeset cs) {
-        String currentComment = getUploadComment();
+        String currentComment = getTagEditorValue("comment");
         Map<String,String> tags = getDefaultTags();
         if (cs != null) {
             tags.putAll(cs.getKeys());
@@ -83,6 +88,9 @@ public class TagSettingsPanel extends JPanel implements TableModelListener {
         if (tags.get("comment") == null) {
             tags.put("comment", currentComment);
         }
+        if (tags.get("source") == null) {
+            tags.put("source", "");
+        }
         String agent = Version.getInstance().getAgentString(false);
         String created_by = tags.get("created_by");
         if (created_by == null || created_by.isEmpty()) {
@@ -122,8 +130,8 @@ public class TagSettingsPanel extends JPanel implements TableModelListener {
     /* -------------------------------------------------------------------------- */
     @Override
     public void tableChanged(TableModelEvent e) {
-        String uploadComment = getUploadComment();
-        changesetCommentModel.setComment(uploadComment);
+        changesetCommentModel.setComment(getTagEditorValue("comment"));
+        changesetSourceModel.setComment(getTagEditorValue("source"));
     }
 
     /**
@@ -132,16 +140,23 @@ public class TagSettingsPanel extends JPanel implements TableModelListener {
      *
      */
     class ChangesetCommentObserver implements Observer {
+
+        private final String key;
+
+        ChangesetCommentObserver(String key) {
+            this.key = key;
+        }
+
         @Override
         public void update(Observable o, Object arg) {
             if (!(o instanceof ChangesetCommentModel)) return;
             String newValue = (String)arg;
-            String oldValue = getUploadComment();
+            String oldValue = getTagEditorValue(key);
             if (oldValue == null) {
                 oldValue = "";
             }
             if (!oldValue.equals(newValue)) {
-                setUploadComment((String)arg);
+                setProperty(key, (String) arg);
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/io/UploadDialog.java b/src/org/openstreetmap/josm/gui/io/UploadDialog.java
index 25cafd6..fd1153a 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadDialog.java
@@ -99,7 +99,8 @@ public class UploadDialog extends JDialog implements PropertyChangeListener, Pre
     private boolean canceled = false;
 
     /** the changeset comment model keeping the state of the changeset comment */
-    private ChangesetCommentModel changesetCommentModel;
+    private final ChangesetCommentModel changesetCommentModel = new ChangesetCommentModel();
+    private final ChangesetCommentModel changesetSourceModel = new ChangesetCommentModel();
 
     /**
      * builds the content panel for the upload dialog
@@ -130,13 +131,11 @@ public class UploadDialog extends JDialog implements PropertyChangeListener, Pre
             }
         };
 
-        changesetCommentModel = new ChangesetCommentModel();
-
-        tpConfigPanels.add(pnlBasicUploadSettings = new BasicUploadSettingsPanel(changesetCommentModel));
+        tpConfigPanels.add(pnlBasicUploadSettings = new BasicUploadSettingsPanel(changesetCommentModel, changesetSourceModel));
         tpConfigPanels.setTitleAt(0, tr("Settings"));
         tpConfigPanels.setToolTipTextAt(0, tr("Decide how to upload the data and which changeset to use"));
 
-        tpConfigPanels.add(pnlTagSettings = new TagSettingsPanel(changesetCommentModel));
+        tpConfigPanels.add(pnlTagSettings = new TagSettingsPanel(changesetCommentModel, changesetSourceModel));
         tpConfigPanels.setTitleAt(1, tr("Tags of new changeset"));
         tpConfigPanels.setToolTipTextAt(1, tr("Apply tags to the changeset data is uploaded to"));
 
