Index: src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/UploadAction.java	(Revision 2033)
+++ src/org/openstreetmap/josm/actions/UploadAction.java	(Arbeitskopie)
@@ -59,7 +59,8 @@
     static private Logger logger = Logger.getLogger(UploadAction.class.getName());
 
     public static final String HISTORY_KEY = "upload.comment.history";
-
+    public static final String SOURCE_KEY = "upload.source.history";
+	
     /** Upload Hook */
     public interface UploadHook {
         /**
@@ -482,6 +483,13 @@
             p.add(cmt, GBC.eol().fill(GBC.HORIZONTAL));
             //final JTextField cmt = new JTextField(lastCommitComment);
 
+            p.add(new JLabel(tr("Source of your changes: (e.g. survey, aerial image, ...)")), GBC.eol().insets(0, 5, 10, 3));
+            SuggestingJHistoryComboBox src = new SuggestingJHistoryComboBox();
+            List<String> srcHistory = new LinkedList<String>(Main.pref.getCollection(SOURCE_KEY, new LinkedList<String>()));
+            src.setHistory(srcHistory);
+            p.add(src, GBC.eol().fill(GBC.HORIZONTAL));
+            //final JTextField src = new JTextField(lastCommitComment);
+			
             // configuration options for atomic upload
             p.add(buildChangesetControlPanel(), GBC.eol().fill(GridBagConstraints.HORIZONTAL));
 
@@ -504,10 +512,15 @@
                 if (cmt.getText().trim().length() < 3) {
                     continue;
                 }
+                if (src.getText().trim().length() < 3) {
+                    continue;
+                }				
 
-                // store the history of comments
+                // store the history of comments and sources
                 cmt.addCurrentItemToHistory();
                 Main.pref.putCollection(HISTORY_KEY, cmt.getHistory());
+                src.addCurrentItemToHistory();
+                Main.pref.putCollection(SOURCE_KEY, src.getHistory());				
                 Main.pref.put("osm-server.atomic-upload", cbUseAtomicUpload.isSelected());
 
                 break;
Index: src/org/openstreetmap/josm/io/OsmApi.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmApi.java	(Revision 2033)
+++ src/org/openstreetmap/josm/io/OsmApi.java	(Arbeitskopie)
@@ -282,7 +282,7 @@
      * @param comment the "commit comment" for the new changeset
      * @throws OsmTransferException signifying a non-200 return code, or connection errors
      */
-    public void createChangeset(String comment, ProgressMonitor progressMonitor) throws OsmTransferException {
+    public void createChangeset(String comment, String source, ProgressMonitor progressMonitor) throws OsmTransferException {
         progressMonitor.beginTask((tr("Opening changeset...")));
         try {
             changeset = new Changeset();
@@ -290,6 +290,7 @@
             Object ua = sysProp.get("http.agent");
             changeset.put("created_by", (ua == null) ? "JOSM" : ua.toString());
             changeset.put("comment", comment);
+			changeset.put("source", source);
             createPrimitive(changeset);
         } finally {
             progressMonitor.finishTask();
Index: src/org/openstreetmap/josm/io/OsmServerWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmServerWriter.java	(Revision 2033)
+++ src/org/openstreetmap/josm/io/OsmServerWriter.java	(Arbeitskopie)
@@ -77,6 +77,21 @@
         return cmt;
     }
 
+	 /**
+     * retrieves the most recent changeset comment from the preferences
+     *
+     * @return the most recent changeset comment
+     */
+    protected String getChangesetSource() {
+        String cmt = "";
+        List<String> history = new LinkedList<String>(
+                Main.pref.getCollection(UploadAction.SOURCE_KEY, new LinkedList<String>()));
+        if(history.size() > 0) {
+            cmt = history.get(0);
+        }
+        return cmt;
+    }
+	
     /**
      * Uploads the changes individually. Invokes one API call per uploaded primitmive.
      * 
@@ -87,7 +102,7 @@
     protected void uploadChangesIndividually(Collection<OsmPrimitive> primitives, ProgressMonitor progressMonitor) throws OsmTransferException {
         try {
             progressMonitor.setTicksCount(primitives.size());
-            api.createChangeset(getChangesetComment(), progressMonitor.createSubTaskMonitor(0, false));
+            api.createChangeset(getChangesetComment(), getChangesetSource(), progressMonitor.createSubTaskMonitor(0, false));
             uploadStartTime = System.currentTimeMillis();
             for (OsmPrimitive osm : primitives) {
                 int progress = progressMonitor.getTicks();
@@ -143,7 +158,7 @@
         // upload everything in one changeset
         //
         try {
-            api.createChangeset(getChangesetComment(), progressMonitor.createSubTaskMonitor(0, false));
+            api.createChangeset(getChangesetComment(), getChangesetSource(), progressMonitor.createSubTaskMonitor(0, false));
             processed.addAll(api.uploadDiff(primitives, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)));
         } catch(OsmTransferException e) {
             throw e;
