Index: /trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 2256)
@@ -7,4 +7,5 @@
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.regex.Pattern;
@@ -142,3 +143,8 @@
         setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
     }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 2256)
@@ -260,3 +260,8 @@
         setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
     }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 2256)
@@ -137,3 +137,8 @@
         setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
     }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 2256)
@@ -175,3 +175,10 @@
         }
     }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        if ("selection".equals(mode)) {
+            setEnabled(selection != null && !selection.isEmpty());
+        }
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 2256)
@@ -202,6 +202,10 @@
         }
         Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        updateEnabledState(selection);
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
         int numWays = 0;
-
         for (OsmPrimitive osm : selection)
             if (osm instanceof Way) {
Index: /trunk/src/org/openstreetmap/josm/actions/CopyAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CopyAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/CopyAction.java	(revision 2256)
@@ -116,5 +116,14 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 2256)
@@ -277,5 +277,14 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/DeleteAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DeleteAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/DeleteAction.java	(revision 2256)
@@ -6,6 +6,8 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.util.Collection;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -28,5 +30,14 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/DistributeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DistributeAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/DistributeAction.java	(revision 2256)
@@ -136,5 +136,14 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java	(revision 2256)
@@ -155,11 +155,16 @@
     }
 
-    /**
-     * Refreshes the enabled state
-     *
-     */
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/DuplicateAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DuplicateAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/DuplicateAction.java	(revision 2256)
@@ -7,5 +7,7 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.util.Collection;
 
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -22,8 +24,16 @@
     }
 
+    @Override
+    protected void updateEnabledState() {
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
 
     @Override
-    protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 2256)
@@ -91,5 +91,14 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 2256)
@@ -149,19 +149,18 @@
         Layer.listeners.add(layerChangeAdapter);
         DataSet.selListeners.add(selectionChangeAdapter);
-        updateEnabledState();
+        initEnabledState();
     }
 
-    /**
-     * This method is called when a layer change event or a selection update event
-     * occurs, see {@see LayerChangeListener} and {@see SelectionChangedListener}.
-     * 
-     * The default implementation is empty. Subclasses can override the method
-     * in order to set the {@see #isEnabled()}-state of a JosmAction depending on
-     * the {@see #getCurrentDataSet()} and the current layers (see
-     * also {@see #getEditLayer()}).
-     * 
-     */
+
+    protected void initEnabledState() {
+        setEnabled(true);
+    }
+
     protected void updateEnabledState() {
-        // override in subclasses
+
+    }
+
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+
     }
 
@@ -190,5 +189,5 @@
     private class SelectionChangeAdapter implements SelectionChangedListener {
         public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-            updateEnabledState();
+            updateEnabledState(newSelection);
         }
     }
Index: /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 2256)
@@ -263,19 +263,25 @@
     }
 
-    /**
-     * Enable the "Merge Nodes" menu option if more than one node is selected
-     */
     @Override
-    public void updateEnabledState() {
-        if (getCurrentDataSet() == null || getCurrentDataSet().getSelected().isEmpty()) {
+    protected void updateEnabledState() {
+        if (getCurrentDataSet() == null) {
             setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        if (selection == null || selection.isEmpty()) {
+            setEnabled(false);
             return;
         }
         boolean ok = true;
-        if (getCurrentDataSet().getSelected().size() < 2) {
+        if (selection.size() < 2) {
             setEnabled(false);
             return;
         }
-        for (OsmPrimitive osm : getCurrentDataSet().getSelected()) {
+        for (OsmPrimitive osm : selection) {
             if (!(osm instanceof Node)) {
                 ok = false;
Index: /trunk/src/org/openstreetmap/josm/actions/MergeSelectionAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MergeSelectionAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/MergeSelectionAction.java	(revision 2256)
@@ -6,7 +6,9 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.util.Collection;
 import java.util.List;
 
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.MergeSourceBuildingVisitor;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
@@ -45,9 +47,14 @@
     @Override
     protected void updateEnabledState() {
-        if (getEditLayer() == null) {
+        if (getCurrentDataSet() == null) {
             setEnabled(false);
-            return;
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
         }
-        setEnabled(!getEditLayer().data.getSelected().isEmpty());
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/MirrorAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MirrorAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/MirrorAction.java	(revision 2256)
@@ -79,5 +79,14 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/MoveAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MoveAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/MoveAction.java	(revision 2256)
@@ -71,16 +71,16 @@
 
         switch (myDirection) {
-        case UP:
-            distx = 0;
-            disty = -disty;
-            break;
-        case DOWN:
-            distx = 0;
-            break;
-        case LEFT:
-            disty = 0;
-            distx = -distx;
-        default:
-            disty = 0;
+            case UP:
+                distx = 0;
+                disty = -disty;
+                break;
+            case DOWN:
+                distx = 0;
+                break;
+            case LEFT:
+                disty = 0;
+                distx = -distx;
+            default:
+                disty = 0;
         }
 
@@ -117,5 +117,14 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java	(revision 2256)
@@ -408,5 +408,14 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 2256)
@@ -284,3 +284,11 @@
         );
     }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(
+                selection!= null && !selection.isEmpty()
+                && !TagCollection.unionOfAllPrimitives(Main.pasteBuffer.getSelected()).isEmpty()
+        );
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java	(revision 2256)
@@ -97,5 +97,24 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getNumWaysInSelection() > 0);
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        if (selection == null) {
+            setEnabled(false);
+            return;
+        }
+        int n = 0;
+        for (OsmPrimitive primitive : selection) {
+            if (primitive instanceof Way) {
+                n++;
+            }
+        }
+        setEnabled(n > 0);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 2256)
@@ -366,7 +366,16 @@
         if (getCurrentDataSet() == null) {
             setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        if (selection == null) {
+            setEnabled(false);
             return;
         }
-        setEnabled(checkSelection(getCurrentDataSet().getSelected()));
+        setEnabled(checkSelection(selection));
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 2256)
@@ -413,5 +413,14 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java	(revision 2256)
@@ -97,13 +97,16 @@
     }
 
-    /**
-     * Refreshes the enabled state
-     *
-     */
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null
-                && ! getCurrentDataSet().getSelected().isEmpty()
-        );
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UploadSelectionAction.java	(revision 2255)
+++ /trunk/src/org/openstreetmap/josm/actions/UploadSelectionAction.java	(revision 2256)
@@ -51,11 +51,16 @@
     }
 
-    /**
-     * Refreshes the enabled state
-     *
-     */
     @Override
     protected void updateEnabledState() {
-        setEnabled(getEditLayer() != null);
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
     }
 
