Index: /trunk/src/org/openstreetmap/josm/actions/AbstractMergeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AbstractMergeAction.java	(revision 5232)
+++ /trunk/src/org/openstreetmap/josm/actions/AbstractMergeAction.java	(revision 5233)
@@ -83,5 +83,5 @@
     protected void warnNoTargetLayersForSourceLayer(Layer sourceLayer) {
         JOptionPane.showMessageDialog(Main.parent,
-                tr("<html>There are no layers the source layer<br>''{0}''<br>could be merged to.</html>"),
+                tr("<html>There are no layers the source layer<br>''{0}''<br>could be merged to.</html>", sourceLayer.getName()),
                 tr("No target layers"), JOptionPane.WARNING_MESSAGE);
     }
Index: /trunk/src/org/openstreetmap/josm/actions/MergeLayerAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MergeLayerAction.java	(revision 5232)
+++ /trunk/src/org/openstreetmap/josm/actions/MergeLayerAction.java	(revision 5233)
@@ -7,4 +7,6 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
@@ -12,4 +14,7 @@
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -25,18 +30,37 @@
     }
 
-    public void merge(List<Layer> sourceLayers) {
-        Layer targetLayer = askTargetLayer(sourceLayers);
+    protected void doMerge(List<Layer> targetLayers, final Collection<Layer> sourceLayers) {
+        final Layer targetLayer = askTargetLayer(targetLayers);
         if (targetLayer == null)
             return;
-        for (Layer l: sourceLayers) {
-            if (l != targetLayer) {
-                targetLayer.mergeFrom(l);
-                Main.map.mapView.removeLayer(l);
+        Main.worker.submit(new Runnable() {
+            @Override
+            public void run() {
+                boolean layerMerged = false;
+                for (Layer sourceLayer: sourceLayers) {
+                    if (sourceLayer != null && sourceLayer != targetLayer) {
+                        if (sourceLayer instanceof OsmDataLayer && targetLayer instanceof OsmDataLayer
+                                && ((OsmDataLayer)sourceLayer).isUploadDiscouraged() != ((OsmDataLayer)targetLayer).isUploadDiscouraged()) {
+                            if (warnMergingUploadDiscouragedLayers(sourceLayer, targetLayer)) {
+                                break;
+                            }
+                        }
+                        targetLayer.mergeFrom(sourceLayer);
+                        Main.map.mapView.removeLayer(sourceLayer);
+                        layerMerged = true;
+                    }
+                }
+                if (layerMerged) {
+                    Main.map.mapView.setActiveLayer(targetLayer);
+                }
             }
-        }
-        Main.map.mapView.setActiveLayer(targetLayer);
+        });
+    }
+    
+    public void merge(List<Layer> sourceLayers) {
+        doMerge(sourceLayers, sourceLayers);
     }
 
-    public void merge(final Layer sourceLayer) {
+    public void merge(Layer sourceLayer) {
         if (sourceLayer == null)
             return;
@@ -46,15 +70,5 @@
             return;
         }
-        final Layer targetLayer = askTargetLayer(targetLayers);
-        if (targetLayer == null)
-            return;
-        Main.worker.submit(new Runnable() {
-            @Override
-            public void run() {
-                targetLayer.mergeFrom(sourceLayer);
-                Main.map.mapView.removeLayer(sourceLayer);
-                Main.map.mapView.setActiveLayer(targetLayer);
-            }
-        });
+        doMerge(targetLayers, Collections.singleton(sourceLayer));
     }
 
@@ -74,3 +88,19 @@
         setEnabled(!LayerListDialog.getInstance().getModel().getPossibleMergeTargets(getEditLayer()).isEmpty());
     }
+    
+    /**
+     * returns true if the user wants to cancel, false if they want to continue
+     */
+    public static final boolean warnMergingUploadDiscouragedLayers(Layer sourceLayer, Layer targetLayer) {
+        return GuiHelper.warnUser(tr("Merging layers with different upload policies"),
+                "<html>" +
+                tr("You are about to merge data between layers ''{0}'' and ''{1}''.<br /><br />"+
+                        "These layers have different upload policies and should not been merged as it.<br />"+
+                        "Merging them will result to enforce the stricter policy (upload discouraged) to ''{1}''.<br /><br />"+
+                        "<b>This is not the recommended way of merging such data</b>.<br />"+
+                        "You should instead check and merge each object, one by one, by using ''<i>Merge selection</i>''.<br /><br />"+
+                        "Are you sure you want to continue?", sourceLayer.getName(), targetLayer.getName(), targetLayer.getName())+
+                "</html>",
+                ImageProvider.get("dialogs", "mergedown"), tr("Ignore this hint and merge anyway"));
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/MergeSelectionAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MergeSelectionAction.java	(revision 5232)
+++ /trunk/src/org/openstreetmap/josm/actions/MergeSelectionAction.java	(revision 5233)
@@ -16,4 +16,6 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -37,4 +39,10 @@
         if (targetLayer == null)
             return;
+        if (getEditLayer().isUploadDiscouraged() && targetLayer instanceof OsmDataLayer && !((OsmDataLayer)targetLayer).isUploadDiscouraged() 
+                && getEditLayer().data.getSelected().size() > 1) {
+            if (warnMergingUploadDiscouragedObjects(targetLayer)) {
+                return;
+            }
+        }
         MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(getEditLayer().data);
         ((OsmDataLayer)targetLayer).mergeFrom(builder.build());
@@ -60,3 +68,17 @@
         setEnabled(selection != null && !selection.isEmpty());
     }
+    
+    /**
+     * returns true if the user wants to cancel, false if they want to continue
+     */
+    public static final boolean warnMergingUploadDiscouragedObjects(Layer targetLayer) {
+        return GuiHelper.warnUser(tr("Merging too many objects with different upload policies"),
+                "<html>" +
+                tr("You are about to merge more than 1 object between layers ''{0}'' and ''{1}''.<br /><br />"+
+                        "<b>This is not the recommended way of merging such data</b>.<br />"+
+                        "You should instead check and merge each object, <b>one by one</b>.<br /><br />"+
+                        "Are you sure you want to continue?", getEditLayer().getName(), targetLayer.getName(), targetLayer.getName())+
+                "</html>",
+                ImageProvider.get("dialogs", "mergedown"), tr("Ignore this hint and merge anyway"));
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 5232)
+++ /trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 5233)
@@ -5,11 +5,8 @@
 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;
@@ -22,5 +19,4 @@
 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;
@@ -28,4 +24,5 @@
 import org.openstreetmap.josm.gui.io.UploadPrimitivesTask;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -126,25 +123,12 @@
      */
     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>" +
+        return GuiHelper.warnUser(tr("Upload discouraged"),
+                "<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;
+                    "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>",
+                ImageProvider.get("upload"), tr("Ignore this hint and upload anyway"));
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/io/SaveLayerInfo.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/io/SaveLayerInfo.java	(revision 5232)
+++ /trunk/src/org/openstreetmap/josm/gui/io/SaveLayerInfo.java	(revision 5233)
@@ -31,5 +31,5 @@
         this.layer = layer;
         this.doSaveToFile = layer.requiresSaveToFile();
-        this.doUploadToServer = layer.requiresUploadToServer();
+        this.doUploadToServer = layer.requiresUploadToServer() && !layer.isUploadDiscouraged();
         this.file = layer.getAssociatedFile();
     }
Index: /trunk/src/org/openstreetmap/josm/gui/io/SaveLayersTableColumnModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/io/SaveLayersTableColumnModel.java	(revision 5232)
+++ /trunk/src/org/openstreetmap/josm/gui/io/SaveLayersTableColumnModel.java	(revision 5233)
@@ -37,5 +37,5 @@
             StringBuilder sb = new StringBuilder();
             sb.append("<html>");
-            if (info.getLayer().requiresUploadToServer()) {
+            if (info.getLayer().requiresUploadToServer() && !info.getLayer().isUploadDiscouraged()) {
                 add(needsUpload, defaultCellStyle);
                 sb.append(tr("Layer ''{0}'' has modifications which should be uploaded to the server.", info.getName()));
@@ -43,5 +43,9 @@
             } else {
                 add(pnlEmpty, defaultCellStyle);
-                sb.append(tr("Layer ''{0}'' has no modifications to be uploaded.", info.getName()));
+                if (info.getLayer().requiresUploadToServer()) {
+                    sb.append(tr("Layer ''{0}'' has modifications which are discouraged to be uploaded.", info.getName()));
+                } else {
+                    sb.append(tr("Layer ''{0}'' has no modifications to be uploaded.", info.getName()));
+                }
             }
             sb.append("<br/>");
Index: /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 5232)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 5233)
@@ -302,4 +302,7 @@
         final PleaseWaitProgressMonitor monitor = new PleaseWaitProgressMonitor(tr("Merging layers"));
         monitor.setCancelable(false);
+        if (from instanceof OsmDataLayer && ((OsmDataLayer)from).isUploadDiscouraged()) {
+            setUploadDiscouraged(true);
+        }
         mergeFrom(((OsmDataLayer)from).data, monitor);
         monitor.close();
@@ -411,5 +414,6 @@
 
     @Override public boolean isMergable(final Layer other) {
-        return other instanceof OsmDataLayer && (isUploadDiscouraged() == ((OsmDataLayer)other).isUploadDiscouraged());
+        // isUploadDiscouraged commented to allow merging between normal layers and discouraged layers with a warning (see #7684) 
+        return other instanceof OsmDataLayer;// && (isUploadDiscouraged() == ((OsmDataLayer)other).isUploadDiscouraged());
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/util/GuiHelper.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/util/GuiHelper.java	(revision 5232)
+++ /trunk/src/org/openstreetmap/josm/gui/util/GuiHelper.java	(revision 5233)
@@ -2,8 +2,18 @@
 package org.openstreetmap.josm.gui.util;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 import java.awt.Component;
 import java.awt.Container;
+import java.awt.Image;
 
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
@@ -33,4 +43,26 @@
         }
     }
+    
+    /**
+     * returns true if the user wants to cancel, false if they
+     * want to continue
+     */
+    public static final boolean warnUser(String title, String content, ImageIcon baseActionIcon, String continueToolTip) {
+        ExtendedDialog dlg = new ExtendedDialog(Main.parent,
+                title, new String[] {tr("Cancel"), tr("Continue")});
+        dlg.setContent(content);
+        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"),
+                continueToolTip});
+        dlg.setIcon(JOptionPane.WARNING_MESSAGE);
+        dlg.setCancelButton(1);
+        return dlg.showDialog().getValue() != 2;
+    }
 
 }
