Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 8788)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 8789)
@@ -805,6 +805,7 @@
      * The action to merge the currently selected layer into another layer.
      */
-    public final class MergeAction extends AbstractAction implements IEnabledStateUpdating {
+    public final class MergeAction extends AbstractAction implements IEnabledStateUpdating, LayerAction, Layer.MultiLayerAction {
         private transient Layer layer;
+        private transient List<Layer> layers;
 
         /**
@@ -814,15 +815,24 @@
          */
         public MergeAction(Layer layer) {
-            this();
+            this(layer, null);
             CheckParameterUtil.ensureParameterNotNull(layer, "layer");
+        }
+
+        /**
+         * Constructs a new {@code MergeAction}.
+         * @param layers the layer list
+         * @throws IllegalArgumentException if {@code layers} is null
+         */
+        public MergeAction(List<Layer> layers) {
+            this(null, layers);
+            CheckParameterUtil.ensureParameterNotNull(layers, "layers");
+        }
+
+        /**
+         * Constructs a new {@code MergeAction}.
+         */
+        private MergeAction(Layer layer, List<Layer> layers) {
             this.layer = layer;
-            putValue(NAME, tr("Merge"));
-            updateEnabledState();
-        }
-
-        /**
-         * Constructs a new {@code MergeAction}.
-         */
-        public MergeAction() {
+            this.layers = layers;
             putValue(NAME, tr("Merge"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "mergedown"));
@@ -836,4 +846,6 @@
             if (layer != null) {
                 Main.main.menu.merge.merge(layer);
+            } else if (layers != null) {
+                Main.main.menu.merge.merge(layers);
             } else {
                 if (getModel().getSelectedLayers().size() == 1) {
@@ -846,12 +858,7 @@
         }
 
-        protected boolean isActiveLayer(Layer layer) {
-            if (!Main.isDisplayingMapView()) return false;
-            return Main.map.mapView.getActiveLayer() == layer;
-        }
-
         @Override
         public void updateEnabledState() {
-            if (layer == null) {
+            if (layer == null && layers == null) {
                 if (getModel().getSelectedLayers().isEmpty()) {
                     setEnabled(false);
@@ -870,8 +877,30 @@
                     setEnabled(!targets.isEmpty());
                 }
-            } else {
+            } else if (layer != null) {
                 List<Layer> targets = getModel().getPossibleMergeTargets(layer);
                 setEnabled(!targets.isEmpty());
-            }
+            } else {
+                setEnabled(supportLayers(layers));
+            }
+        }
+
+        @Override
+        public boolean supportLayers(List<Layer> layers) {
+            for (Layer l : layers) {
+                if (!(l instanceof OsmDataLayer)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        @Override
+        public Component createMenuComponent() {
+            return new JMenuItem(this);
+        }
+
+        @Override
+        public MergeAction getMultiLayerAction(List<Layer> layers) {
+            return new MergeAction(layers);
         }
     }
