Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 8817)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 8818)
@@ -864,12 +864,5 @@
                     setEnabled(false);
                 } else  if (getModel().getSelectedLayers().size() > 1) {
-                    Layer firstLayer = getModel().getSelectedLayers().get(0);
-                    for (Layer l: getModel().getSelectedLayers()) {
-                        if (l != firstLayer && (!l.isMergable(firstLayer) || !firstLayer.isMergable(l))) {
-                            setEnabled(false);
-                            return;
-                        }
-                    }
-                    setEnabled(true);
+                    setEnabled(supportLayers(getModel().getSelectedLayers()));
                 } else {
                     Layer selectedLayer = getModel().getSelectedLayers().get(0);
@@ -887,10 +880,11 @@
         @Override
         public boolean supportLayers(List<Layer> layers) {
-            for (Layer l : layers) {
-                if (!(l instanceof OsmDataLayer)) {
-                    return false;
-                }
-            }
-            return true;
+            if (layers.size() < 1) {
+                return false;
+            } else {
+                final Layer firstLayer = layers.get(0);
+                final List<Layer> remainingLayers = layers.subList(1, layers.size());
+                return getModel().getPossibleMergeTargets(firstLayer).containsAll(remainingLayers);
+            }
         }
 
@@ -1504,7 +1498,8 @@
         public List<Layer> getPossibleMergeTargets(Layer source) {
             List<Layer> targets = new ArrayList<>();
-            if (source == null)
+            if (source == null || !Main.isDisplayingMapView()) {
                 return targets;
-            for (Layer target : getLayers()) {
+            }
+            for (Layer target : Main.map.mapView.getAllLayersAsList()) {
                 if (source == target) {
                     continue;
Index: /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 8817)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 8818)
@@ -185,4 +185,5 @@
                 LayerListDialog.getInstance().createShowHideLayerAction(),
                 LayerListDialog.getInstance().createDeleteLayerAction(),
+                LayerListDialog.getInstance().createMergeLayerAction(this),
                 SeparatorLayerAction.INSTANCE,
                 new LayerSaveAction(this),
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 8817)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 8818)
@@ -335,4 +335,5 @@
         entries.add(LayerListDialog.getInstance().createShowHideLayerAction());
         entries.add(LayerListDialog.getInstance().createDeleteLayerAction());
+        entries.add(LayerListDialog.getInstance().createMergeLayerAction(this));
         entries.add(new RenameLayerAction(null, this));
         entries.add(SeparatorLayerAction.INSTANCE);
Index: /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 8817)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 8818)
@@ -253,4 +253,5 @@
         components.add(new ShowHideMarkerText(this));
         components.add(LayerListDialog.getInstance().createDeleteLayerAction());
+        components.add(LayerListDialog.getInstance().createMergeLayerAction(this));
         components.add(SeparatorLayerAction.INSTANCE);
         components.add(new CustomizeColor(this));
