Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 6564)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 6565)
@@ -827,5 +827,5 @@
      * @since 5519
      */
-    public static boolean saveUnsavedModifications(List<? extends Layer> selectedLayers, boolean exit) {
+    public static boolean saveUnsavedModifications(Iterable<? extends Layer> selectedLayers, boolean exit) {
         SaveLayersDialog dialog = new SaveLayersDialog(parent);
         List<OsmDataLayer> layersWithUnmodifiedChanges = new ArrayList<OsmDataLayer>();
Index: trunk/src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 6564)
+++ trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 6565)
@@ -7,4 +7,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -231,5 +232,10 @@
             @Override
             public void run() {
-                dialog.setDefaultChangesetTags(layer.data.getChangeSetTags());
+                final HashMap<String, String> tags = new HashMap<String, String>(layer.data.getChangeSetTags());
+                if (!tags.containsKey("source")) {
+                    tags.put("source", Main.map.mapView.getLayerInformationForSourceTag());
+                    System.out.println(tags.get("source"));
+                }
+                dialog.setDefaultChangesetTags(tags);
             }
         });
Index: trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java	(revision 6564)
+++ trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java	(revision 6565)
@@ -10,4 +10,5 @@
 import java.awt.event.ActionEvent;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -47,5 +48,5 @@
         @Override
         public void actionPerformed(ActionEvent e) {
-            List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
+            Collection<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
             if (layers.isEmpty()) {
                 setEnabled(false);
@@ -58,5 +59,5 @@
             JPopupMenu popup = new JPopupMenu();
             if (layers.size() == 1) {
-                JComponent c = layers.get(0).getOffsetMenuItem(popup);
+                JComponent c = layers.iterator().next().getOffsetMenuItem(popup);
                 if (c instanceof JMenuItem) {
                     ((JMenuItem) c).getAction().actionPerformed(e);
@@ -183,5 +184,5 @@
             return singleOffset;
         }
-        List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
+        Collection<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
         if (layers.isEmpty()) {
             offsetAction.setEnabled(false);
@@ -200,5 +201,5 @@
         newMenu.setAction(offsetAction);
         if (layers.size() == 1)
-            return (JMenuItem)layers.get(0).getOffsetMenuItem(newMenu);
+            return (JMenuItem)layers.iterator().next().getOffsetMenuItem(newMenu);
         for (ImageryLayer layer : layers) {
             JMenuItem layerMenu = layer.getOffsetMenuItem();
Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 6564)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 6565)
@@ -52,7 +52,9 @@
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.MultipolygonCache;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
+import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.MapViewPaintable;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
 import org.openstreetmap.josm.gui.layer.markerlayer.PlayHeadMarker;
@@ -61,4 +63,5 @@
 import org.openstreetmap.josm.tools.BugReportExceptionHandler;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -733,12 +736,6 @@
      * @return an unmodifiable list of layers of a certain type.
      */
-    public <T> List<T>  getLayersOfType(Class<T> ofType) {
-        List<T> ret = new ArrayList<T>();
-        for (Layer layer : getAllLayersAsList()) {
-            if (ofType.isInstance(layer)) {
-                ret.add(ofType.cast(layer));
-            }
-        }
-        return ret;
+    public <T extends Layer> Collection<T>  getLayersOfType(Class<T> ofType) {
+        return Utils.filteredCollection(getAllLayers(), ofType);
     }
 
@@ -968,3 +965,21 @@
         }
     }
+
+    /**
+     * Get a string representation of all layers suitable for the {@code source} changeset tag.
+     */
+    public String getLayerInformationForSourceTag() {
+        final Collection<String> layerInfo = new ArrayList<String>();
+        if (!getLayersOfType(GpxLayer.class).isEmpty()) {
+            // no i18n for international values
+            layerInfo.add("survey");
+        }
+        for (final GeoImageLayer i : getLayersOfType(GeoImageLayer.class)) {
+            layerInfo.add(i.getName());
+        }
+        for (final ImageryLayer i : getLayersOfType(ImageryLayer.class)) {
+            layerInfo.add(i.getName());
+        }
+        return Utils.join("; ", layerInfo);
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java	(revision 6564)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java	(revision 6565)
@@ -889,5 +889,5 @@
     protected final <P extends OsmPrimitive> OsmDataLayer findLayerFor(P primitive) {
         if (primitive != null) {
-            List<OsmDataLayer> layers = Main.map.mapView.getLayersOfType(OsmDataLayer.class);
+            Iterable<OsmDataLayer> layers = Main.map.mapView.getLayersOfType(OsmDataLayer.class);
             // Find layer with same dataset
             for (OsmDataLayer layer : layers) {
Index: trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 6564)
+++ trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 6565)
@@ -12,4 +12,5 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedList;
@@ -65,5 +66,5 @@
         pnl.add(new JLabel(tr("Specify 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>()));
+        List<String> sourceHistory = new LinkedList<String>(Main.pref.getCollection(SOURCE_HISTORY_KEY, Arrays.asList("knowledge", "survey")));
         Collections.reverse(sourceHistory); // we have to reverse the history, because ComboBoxHistory will reverse it again in addElement()
         hcbUploadSource.setPossibleItems(sourceHistory);
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 6564)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 6565)
@@ -314,9 +314,6 @@
     public void setDefaultChangesetTags(Map<String, String> tags) {
         pnlTagSettings.setDefaultTags(tags);
-         for (Entry<String, String> entry: tags.entrySet()) {
-            if ("comment".equals(entry.getKey())) {
-                changesetCommentModel.setComment(entry.getValue());
-            }
-        }
+        changesetCommentModel.setComment(tags.get("comment"));
+        changesetSourceModel.setComment(tags.get("source"));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java	(revision 6564)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java	(revision 6565)
@@ -8,4 +8,5 @@
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
@@ -95,5 +96,5 @@
 
     protected WMSLayer askWMSLayer() {
-        List<WMSLayer> targetLayers = Main.map.mapView.getLayersOfType(WMSLayer.class);
+        Collection<WMSLayer> targetLayers = Main.map.mapView.getLayersOfType(WMSLayer.class);
         if (targetLayers.isEmpty()) {
             warnNoImageryLayers();
