Index: core/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java
===================================================================
--- core/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java	(revision 0)
+++ core/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java	(revision 0)
@@ -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: core/src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- core/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 4920)
+++ core/src/org/openstreetmap/josm/actions/UploadAction.java	(working copy)
@@ -4,10 +4,13 @@
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 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;
 
@@ -18,11 +21,13 @@
 import org.openstreetmap.josm.actions.upload.ValidateUploadHook;
 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;
 import org.openstreetmap.josm.gui.io.UploadDialog;
 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;
 
 /**
@@ -103,7 +108,7 @@
         return checkPreUploadConditions(layer, new APIDataSet(layer.data));
     }
 
-    protected void alertUnresolvedConflicts(OsmDataLayer layer) {
+    protected static void alertUnresolvedConflicts(OsmDataLayer layer) {
         HelpAwareOptionPane.showOptionDialog(
                 Main.parent,
                 tr("<html>The data to be uploaded participates in unresolved conflicts of layer ''{0}''.<br>"
@@ -114,10 +119,38 @@
                 HelpUtil.ht("/Action/Upload#PrimitivesParticipateInConflicts")
         );
     }
+    
+    /**
+     * 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.
      *
      * @param layer the source layer of the data to be uploaded
@@ -125,6 +158,11 @@
      * @return true, if the preconditions are met; false, otherwise
      */
     public boolean checkPreUploadConditions(OsmDataLayer layer, APIDataSet apiData) {
+        if (layer.isUploadDiscouraged()) {
+            if (warnUploadDiscouraged(layer)) {
+                return false;
+            }
+        }
         ConflictCollection conflicts = layer.getConflicts();
         if (apiData.participatesInConflict(conflicts)) {
             alertUnresolvedConflicts(layer);
Index: core/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
===================================================================
--- core/src/org/openstreetmap/josm/actions/UploadSelectionAction.java	(revision 4920)
+++ core/src/org/openstreetmap/josm/actions/UploadSelectionAction.java	(working copy)
@@ -87,6 +87,11 @@
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled())
             return;
+        if (getEditLayer().isUploadDiscouraged()) {
+            if (UploadAction.warnUploadDiscouraged(getEditLayer())) {
+                return;
+            }
+        }
         UploadHullBuilder builder = new UploadHullBuilder();
         UploadSelectionDialog dialog = new UploadSelectionDialog();
         Collection<OsmPrimitive> modifiedCandidates = getModifiedPrimitives(getEditLayer().data.getSelected());
Index: core/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- core/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 4920)
+++ core/src/org/openstreetmap/josm/data/osm/DataSet.java	(working copy)
@@ -124,6 +124,8 @@
     private final List<AbstractDatasetChangedEvent> cachedEvents = new ArrayList<AbstractDatasetChangedEvent>();
 
     private int highlightUpdateCount;
+    
+    private boolean uploadDiscouraged = false;
 
     private final ReadWriteLock lock = new ReentrantReadWriteLock();
     private final Object selectionLock = new Object();
@@ -206,6 +208,14 @@
         this.version = version;
     }
 
+    public final boolean isUploadDiscouraged() {
+        return uploadDiscouraged;
+    }
+
+    public final void setUploadDiscouraged(boolean uploadDiscouraged) {
+        this.uploadDiscouraged = uploadDiscouraged;
+    }
+
     /*
      * Holding bin for changeset tag information, to be applied when or if this is ever uploaded.
      */
Index: core/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- core/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 4920)
+++ core/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(working copy)
@@ -12,6 +12,7 @@
 import java.awt.Composite;
 import java.awt.Graphics2D;
 import java.awt.GridBagLayout;
+import java.awt.Image;
 import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.TexturePaint;
@@ -20,6 +21,7 @@
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -29,6 +31,7 @@
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.Icon;
+import javax.swing.ImageIcon;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
@@ -36,7 +39,9 @@
 import javax.swing.JTextArea;
 
 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;
 import org.openstreetmap.josm.data.conflict.Conflict;
@@ -218,7 +223,14 @@
      *         updated by a background thread to not disturb the running programm.
      */
     @Override public Icon getIcon() {
-        return ImageProvider.get("layer", "osmdata_small");
+        Icon baseIcon = ImageProvider.get("layer", "osmdata_small");
+        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;
+        }
     }
 
     /**
@@ -394,7 +406,7 @@
 
 
     @Override public boolean isMergable(final Layer other) {
-        return other instanceof OsmDataLayer;
+        return other instanceof OsmDataLayer && (isUploadDiscouraged() == ((OsmDataLayer)other).isUploadDiscouraged());
     }
 
     @Override public void visitBoundingBox(final BoundingXYVisitor v) {
@@ -456,7 +468,10 @@
         p.add(new JLabel(nodeText, ImageProvider.get("data", "node"), JLabel.HORIZONTAL), GBC.eop().insets(15,0,0,0));
         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;
     }
@@ -474,7 +489,8 @@
                 new ConsistencyTestAction(),
                 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(),
                 LayerListDialog.getInstance().createDeleteLayerAction(),
@@ -485,10 +501,15 @@
                 new LayerGpxExportAction(this),
                 new ConvertToGpxLayerAction(),
                 SeparatorLayerAction.INSTANCE,
-                new RenameLayerAction(getAssociatedFile(), this),
+                new RenameLayerAction(getAssociatedFile(), this)}));
+        if (ExpertToggleAction.isExpert()) {
+            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]);
     }
 
     public static GpxData toGpxData(DataSet data, File file) {
@@ -701,4 +722,12 @@
          * change listener and already got notified.
          */
     }
+
+    public final boolean isUploadDiscouraged() {
+        return data.isUploadDiscouraged();
+    }
+
+    public final void setUploadDiscouraged(boolean uploadDiscouraged) {
+        data.setUploadDiscouraged(uploadDiscouraged);
+    }
 }
Index: core/src/org/openstreetmap/josm/io/OsmExporter.java
===================================================================
--- core/src/org/openstreetmap/josm/io/OsmExporter.java	(revision 4920)
+++ core/src/org/openstreetmap/josm/io/OsmExporter.java	(working copy)
@@ -73,10 +73,7 @@
             OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, layer.data.getVersion());
             layer.data.getReadLock().lock();
             try {
-                w.header();
-                w.writeDataSources(layer.data);
-                w.writeContent(layer.data);
-                w.footer();
+                w.writeLayer(layer);
                 w.close();
             } finally {
                 layer.data.getReadLock().unlock();
Index: core/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- core/src/org/openstreetmap/josm/io/OsmReader.java	(revision 4920)
+++ core/src/org/openstreetmap/josm/io/OsmReader.java	(working copy)
@@ -116,6 +116,10 @@
             throwException(tr("Unsupported version: {0}", v));
         }
         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;
         if (parser.getAttributeValue(null, "upload-changeset") != null) {
Index: core/src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- core/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 4920)
+++ core/src/org/openstreetmap/josm/io/OsmWriter.java	(working copy)
@@ -25,6 +25,7 @@
 import org.openstreetmap.josm.data.osm.Tagged;
 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;
 
 /**
@@ -61,9 +62,16 @@
     }
 
     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'>");
     }
     public void footer() {
@@ -82,6 +90,13 @@
         Collections.sort(result, byIdComparator);
         return result;
     }
+    
+    public void writeLayer(OsmDataLayer layer) {
+        header(!layer.isUploadDiscouraged());
+        writeDataSources(layer.data);
+        writeContent(layer.data);
+        footer();
+    }
 
     public void writeContent(DataSet ds) {
         for (OsmPrimitive n : sortById(ds.getNodes())) {
Index: core/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java
===================================================================
--- core/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java	(revision 4920)
+++ core/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java	(working copy)
@@ -221,10 +221,7 @@
         OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, layer.data.getVersion());
         layer.data.getReadLock().lock();
         try {
-            w.header();
-            w.writeDataSources(layer.data);
-            w.writeContent(layer.data);
-            w.footer();
+            w.writeLayer(layer);
             w.flush();
         } finally {
             layer.data.getReadLock().unlock();
