Index: trunk/src/org/openstreetmap/josm/actions/MergeLayerAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/MergeLayerAction.java	(revision 4264)
+++ trunk/src/org/openstreetmap/josm/actions/MergeLayerAction.java	(revision 4265)
@@ -2,6 +2,6 @@
 package org.openstreetmap.josm.actions;
 
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 
 import java.awt.event.ActionEvent;
@@ -20,8 +20,21 @@
                 .registerShortcut("system:merge", tr("Edit: {0}", tr("Merge")), KeyEvent.VK_M, Shortcut.GROUP_MENU),
                 false /* register */
-        );
+                );
         putValue("help", ht("/Action/MergeLayer"));
         putValue("toolbar", "action/mergelayer");
         Main.toolbar.register(this);
+    }
+
+    public void merge(List<Layer> sourceLayers) {
+        Layer targetLayer = askTargetLayer(sourceLayers);
+        if (targetLayer == null)
+            return;
+        for (Layer l: sourceLayers) {
+            if (l != targetLayer) {
+                targetLayer.mergeFrom(l);
+                Main.map.mapView.removeLayer(l);
+            }
+        }
+        Main.map.mapView.setActiveLayer(targetLayer);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 4264)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 4265)
@@ -236,5 +236,5 @@
                     }
                 }
-        );
+                );
 
         add(createButtonPanel(), BorderLayout.SOUTH);
@@ -278,5 +278,5 @@
                     }
                 }
-        );
+                );
     }
 
@@ -298,5 +298,5 @@
                     }
                 }
-        );
+                );
     }
 
@@ -654,6 +654,10 @@
                 new MergeLayerAction().merge(layer);
             } else {
-                Layer selectedLayer = getModel().getSelectedLayers().get(0);
-                new MergeLayerAction().merge(selectedLayer);
+                if (getModel().getSelectedLayers().size() == 1) {
+                    Layer selectedLayer = getModel().getSelectedLayers().get(0);
+                    new MergeLayerAction().merge(selectedLayer);
+                } else {
+                    new MergeLayerAction().merge(getModel().getSelectedLayers());
+                }
             }
         }
@@ -668,11 +672,20 @@
         public void updateEnabledState() {
             if (layer == null) {
-                if (getModel().getSelectedLayers().size() != 1) {
+                if (getModel().getSelectedLayers().isEmpty()) {
                     setEnabled(false);
-                    return;
-                }
-                Layer selectedLayer = getModel().getSelectedLayers().get(0);
-                List<Layer> targets = getModel().getPossibleMergeTargets(selectedLayer);
-                setEnabled(!targets.isEmpty());
+                } else  if (getModel().getSelectedLayers().size() > 1) {
+                    Layer firstLayer = getModel().getSelectedLayers().get(0);
+                    for (Layer l: getModel().getSelectedLayers()) {
+                        if (l != firstLayer && !l.isMergable(firstLayer)) {
+                            setEnabled(false);
+                            return;
+                        }
+                    }
+                    setEnabled(true);
+                } else {
+                    Layer selectedLayer = getModel().getSelectedLayers().get(0);
+                    List<Layer> targets = getModel().getPossibleMergeTargets(selectedLayer);
+                    setEnabled(!targets.isEmpty());
+                }
             } else {
                 List<Layer> targets = getModel().getPossibleMergeTargets(layer);
@@ -847,12 +860,15 @@
                         oc = l.getColor(false);
                         if(oc != null) {
-                            if(oc.equals(c))
+                            if(oc.equals(c)) {
                                 oc = null;
-                            else
+                            } else {
                                 break;
+                            }
                         }
                     }
-                    if(oc == null) /* not more than one color, don't use coloring */
+                    /* not more than one color, don't use coloring */
+                    if(oc == null) {
                         c = null;
+                    }
                 }
                 /* Setting foreground properly handles null as default! */
