Index: /trunk/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java	(revision 5025)
+++ /trunk/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java	(revision 5025)
@@ -0,0 +1,25 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+
+import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+public class ToggleUploadDiscouragedLayerAction extends JosmAction {
+
+    private OsmDataLayer layer;
+    
+    public ToggleUploadDiscouragedLayerAction(OsmDataLayer layer) {
+        super(tr("Encourage/discourage upload"), null, null, null, false);
+        this.layer = layer;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        layer.setUploadDiscouraged(!layer.isUploadDiscouraged());
+        LayerListDialog.getInstance().repaint();
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 5024)
+++ /trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 5025)
@@ -5,8 +5,11 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Image;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.util.LinkedList;
 
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
 import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
@@ -19,4 +22,5 @@
 import org.openstreetmap.josm.data.APIDataSet;
 import org.openstreetmap.josm.data.conflict.ConflictCollection;
+import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.help.HelpUtil;
@@ -24,4 +28,5 @@
 import org.openstreetmap.josm.gui.io.UploadPrimitivesTask;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -104,5 +109,5 @@
     }
 
-    protected void alertUnresolvedConflicts(OsmDataLayer layer) {
+    protected static void alertUnresolvedConflicts(OsmDataLayer layer) {
         HelpAwareOptionPane.showOptionDialog(
                 Main.parent,
@@ -115,8 +120,36 @@
         );
     }
+    
+    /**
+     * returns true if the user wants to cancel, false if they
+     * want to continue
+     */
+    public static final boolean warnUploadDiscouraged(OsmDataLayer layer) {
+        ExtendedDialog dlg = new ExtendedDialog(Main.parent,
+                tr("Upload discouraged"),
+                new String[] {tr("Cancel"), tr("Continue")});
+        dlg.setContent("<html>" +
+                tr("You are about to upload data from the layer ''{0}''.<br /><br />"+
+                        "Sending data from this layer is <b>strongly discouraged</b>. If you continue,<br />"+
+                        "it may require you subsequently have to revert your changes, or force other contributors to.<br /><br />"+
+                        "Are you sure you want to continue?", layer.getName())+
+                "</html>");
+        dlg.setButtonIcons(new Icon[] {
+                ImageProvider.get("cancel"),
+                ImageProvider.overlay(
+                        ImageProvider.get("upload"),
+                        new ImageIcon(ImageProvider.get("warning-small").getImage().getScaledInstance(10 , 10, Image.SCALE_SMOOTH)),
+                        ImageProvider.OverlayPosition.SOUTHEAST)});
+        dlg.setToolTipTexts(new String[] {
+                tr("Cancel"),
+                tr("Ignore this hint and upload anyway")});
+        dlg.setIcon(JOptionPane.WARNING_MESSAGE);
+        dlg.setCancelButton(1);
+        return dlg.showDialog().getValue() != 2;
+    }
 
     /**
      * Check whether the preconditions are met to upload data in <code>apiData</code>.
-     * Makes sure primitives in <code>apiData</code> don't participate in conflicts and
+     * Makes sure upload is allowed, primitives in <code>apiData</code> don't participate in conflicts and
      * runs the installed {@see UploadHook}s.
      *
@@ -126,4 +159,9 @@
      */
     public boolean checkPreUploadConditions(OsmDataLayer layer, APIDataSet apiData) {
+        if (layer.isUploadDiscouraged()) {
+            if (warnUploadDiscouraged(layer)) {
+                return false;
+            }
+        }
         ConflictCollection conflicts = layer.getConflicts();
         if (apiData.participatesInConflict(conflicts)) {
Index: /trunk/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UploadSelectionAction.java	(revision 5024)
+++ /trunk/src/org/openstreetmap/josm/actions/UploadSelectionAction.java	(revision 5025)
@@ -88,4 +88,9 @@
         if (!isEnabled())
             return;
+        if (getEditLayer().isUploadDiscouraged()) {
+            if (UploadAction.warnUploadDiscouraged(getEditLayer())) {
+                return;
+            }
+        }
         UploadHullBuilder builder = new UploadHullBuilder();
         UploadSelectionDialog dialog = new UploadSelectionDialog();
Index: /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 5024)
+++ /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 5025)
@@ -125,4 +125,6 @@
 
     private int highlightUpdateCount;
+    
+    private boolean uploadDiscouraged = false;
 
     private final ReadWriteLock lock = new ReentrantReadWriteLock();
@@ -205,4 +207,12 @@
     public void setVersion(String version) {
         this.version = version;
+    }
+
+    public final boolean isUploadDiscouraged() {
+        return uploadDiscouraged;
+    }
+
+    public final void setUploadDiscouraged(boolean uploadDiscouraged) {
+        this.uploadDiscouraged = uploadDiscouraged;
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 5024)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 5025)
@@ -13,4 +13,5 @@
 import java.awt.Graphics2D;
 import java.awt.GridBagLayout;
+import java.awt.Image;
 import java.awt.Point;
 import java.awt.Rectangle;
@@ -21,4 +22,5 @@
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -30,4 +32,5 @@
 import javax.swing.Action;
 import javax.swing.Icon;
+import javax.swing.ImageIcon;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
@@ -37,5 +40,7 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.ExpertToggleAction;
 import org.openstreetmap.josm.actions.RenameLayerAction;
+import org.openstreetmap.josm.actions.ToggleUploadDiscouragedLayerAction;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.SelectionChangedListener;
@@ -214,4 +219,8 @@
     }
 
+    protected Icon getBaseIcon() {
+        return ImageProvider.get("layer", "osmdata_small");
+    }
+    
     /**
      * TODO: @return Return a dynamic drawn icon of the map data. The icon is
@@ -219,5 +228,12 @@
      */
     @Override public Icon getIcon() {
-        return ImageProvider.get("layer", "osmdata_small");
+        Icon baseIcon = getBaseIcon();
+        if (isUploadDiscouraged()) {
+            return ImageProvider.overlay(baseIcon,
+                    new ImageIcon(ImageProvider.get("warning-small").getImage().getScaledInstance(8, 8, Image.SCALE_SMOOTH)),
+                    ImageProvider.OverlayPosition.SOUTHEAST);
+        } else {
+            return baseIcon;
+        }
     }
 
@@ -395,5 +411,5 @@
 
     @Override public boolean isMergable(final Layer other) {
-        return other instanceof OsmDataLayer;
+        return other instanceof OsmDataLayer && (isUploadDiscouraged() == ((OsmDataLayer)other).isUploadDiscouraged());
     }
 
@@ -457,5 +473,8 @@
         p.add(new JLabel(wayText, ImageProvider.get("data", "way"), JLabel.HORIZONTAL), GBC.eop().insets(15,0,0,0));
         p.add(new JLabel(relationText, ImageProvider.get("data", "relation"), JLabel.HORIZONTAL), GBC.eop().insets(15,0,0,0));
-        p.add(new JLabel(tr("API version: {0}", (data.getVersion() != null) ? data.getVersion() : tr("unset"))));
+        p.add(new JLabel(tr("API version: {0}", (data.getVersion() != null) ? data.getVersion() : tr("unset"))), GBC.eop().insets(15,0,0,0));
+        if (isUploadDiscouraged()) {
+            p.add(new JLabel(tr("Upload is discouraged")), GBC.eop().insets(15,0,0,0));
+        }
 
         return p;
@@ -475,5 +494,6 @@
                 SeparatorLayerAction.INSTANCE,
                 new LayerListPopup.InfoAction(this)};
-        return new Action[]{
+        ArrayList<Action> actions = new ArrayList<Action>();
+        actions.addAll(Arrays.asList(new Action[]{
                 LayerListDialog.getInstance().createActivateLayerAction(this),
                 LayerListDialog.getInstance().createShowHideLayerAction(),
@@ -486,8 +506,13 @@
                 new ConvertToGpxLayerAction(),
                 SeparatorLayerAction.INSTANCE,
-                new RenameLayerAction(getAssociatedFile(), this),
+                new RenameLayerAction(getAssociatedFile(), this)}));
+        if (ExpertToggleAction.isExpert() && Main.pref.getBoolean("data.layer.upload_discouragement.menu_item", false)) {
+            actions.add(new ToggleUploadDiscouragedLayerAction(this));
+        }
+        actions.addAll(Arrays.asList(new Action[]{
                 new ConsistencyTestAction(),
                 SeparatorLayerAction.INSTANCE,
-                new LayerListPopup.InfoAction(this)};
+                new LayerListPopup.InfoAction(this)}));
+        return actions.toArray(new Action[0]);
     }
 
@@ -702,3 +727,11 @@
          */
     }
+
+    public final boolean isUploadDiscouraged() {
+        return data.isUploadDiscouraged();
+    }
+
+    public final void setUploadDiscouraged(boolean uploadDiscouraged) {
+        data.setUploadDiscouraged(uploadDiscouraged);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/io/OsmExporter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmExporter.java	(revision 5024)
+++ /trunk/src/org/openstreetmap/josm/io/OsmExporter.java	(revision 5025)
@@ -74,8 +74,5 @@
             layer.data.getReadLock().lock();
             try {
-                w.header();
-                w.writeDataSources(layer.data);
-                w.writeContent(layer.data);
-                w.footer();
+                w.writeLayer(layer);
                 w.close();
             } finally {
Index: /trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 5024)
+++ /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 5025)
@@ -117,4 +117,8 @@
         }
         ds.setVersion(v);
+        String upload = parser.getAttributeValue(null, "upload");
+        if (upload != null) {
+            ds.setUploadDiscouraged(!Boolean.parseBoolean(upload));
+        }
         String generator = parser.getAttributeValue(null, "generator");
         Long uploadChangesetId = null;
Index: /trunk/src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 5024)
+++ /trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 5025)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.DateUtils;
 
@@ -62,7 +63,14 @@
 
     public void header() {
+        header(null);
+    }
+    public void header(Boolean upload) {
         out.println("<?xml version='1.0' encoding='UTF-8'?>");
         out.print("<osm version='");
         out.print(version);
+        if (upload != null) {
+            out.print("' upload='");
+            out.print(upload);
+        }
         out.println("' generator='JOSM'>");
     }
@@ -82,4 +90,11 @@
         Collections.sort(result, byIdComparator);
         return result;
+    }
+    
+    public void writeLayer(OsmDataLayer layer) {
+        header(!layer.isUploadDiscouraged());
+        writeDataSources(layer.data);
+        writeContent(layer.data);
+        footer();
     }
 
Index: /trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java	(revision 5024)
+++ /trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java	(revision 5025)
@@ -221,8 +221,5 @@
         layer.data.getReadLock().lock();
         try {
-            w.header();
-            w.writeDataSources(layer.data);
-            w.writeContent(layer.data);
-            w.footer();
+            w.writeLayer(layer);
             w.flush();
         } finally {
