Index: /trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 1820)
@@ -85,3 +85,8 @@
 
     protected abstract String createInfoUrl(OsmPrimitive primitive);
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/AddNodeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AddNodeAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/AddNodeAction.java	(revision 1820)
@@ -15,8 +15,6 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.AddCommand;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -26,5 +24,5 @@
  * and when ok is pressed, a new node is created at the specified position.
  */
-public final class AddNodeAction extends JosmAction implements LayerChangeListener {
+public final class AddNodeAction extends JosmAction {
 
     public AddNodeAction() {
@@ -32,12 +30,4 @@
                 Shortcut.registerShortcut("addnode", tr("Edit: {0}", tr("Add Node...")), KeyEvent.VK_D, Shortcut.GROUP_EDIT,
                         Shortcut.SHIFT_DEFAULT), true);
-        Layer.listeners.add(this);
-        refreshEnabled();
-    }
-
-    protected void refreshEnabled() {
-        setEnabled(Main.map != null
-                && Main.map.mapView != null
-                && Main.map.mapView.getEditLayer() != null);
     }
 
@@ -83,15 +73,9 @@
     }
 
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getEditLayer() != null);
     }
 
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
+}
 
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
-    }
-}
Index: /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 1820)
@@ -79,4 +79,7 @@
 
     public void actionPerformed(ActionEvent e) {
+        if (!isEnabled())
+            return;
+
         Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
         Collection<Node> nodes = new LinkedList<Node>();
@@ -208,3 +211,8 @@
         Main.map.repaint();
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 1820)
@@ -40,4 +40,6 @@
      */
     public void actionPerformed(ActionEvent e) {
+        if (!isEnabled())
+            return;
         Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
         Collection<Node> nodes = new LinkedList<Node>();
@@ -125,3 +127,8 @@
         Main.map.repaint();
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 1820)
@@ -117,3 +117,9 @@
         return v;
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(Main.map != null);
+    }
+
 }
Index: /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 1820)
@@ -30,6 +30,4 @@
 import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
-import org.openstreetmap.josm.data.SelectionChangedListener;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -39,6 +37,4 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Pair;
@@ -50,12 +46,9 @@
  * @author Imi
  */
-public class CombineWayAction extends JosmAction implements SelectionChangedListener,LayerChangeListener {
+public class CombineWayAction extends JosmAction {
 
     public CombineWayAction() {
         super(tr("Combine Way"), "combineway", tr("Combine several ways into one."),
                 Shortcut.registerShortcut("tools:combineway", tr("Tool: {0}", tr("Combine Way")), KeyEvent.VK_C, Shortcut.GROUP_EDIT), true);
-        DataSet.selListeners.add(this);
-        Layer.listeners.add(this);
-        refreshEnabled();
     }
 
@@ -300,12 +293,6 @@
     }
 
-    /**
-     * Enable the "Combine way" menu option if more then one way is selected
-     */
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        refreshEnabled();
-    }
-
-    protected void refreshEnabled() {
+    @Override
+    protected void updateEnabledState() {
         if (getCurrentDataSet() == null) {
             setEnabled(false);
@@ -321,18 +308,3 @@
         setEnabled(numWays >= 2);
     }
-
-
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
-    }
-
 }
Index: /trunk/src/org/openstreetmap/josm/actions/CopyAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CopyAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/CopyAction.java	(revision 1820)
@@ -16,5 +16,4 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DataSource;
@@ -27,5 +26,5 @@
 import org.openstreetmap.josm.tools.Shortcut;
 
-public final class CopyAction extends JosmAction implements SelectionChangedListener {
+public final class CopyAction extends JosmAction {
 
     private LinkedList<JosmAction> listeners;
@@ -35,6 +34,4 @@
                 tr("Copy selected objects to paste buffer."),
                 Shortcut.registerShortcut("system:copy", tr("Edit: {0}", tr("Copy")), KeyEvent.VK_C, Shortcut.GROUP_MENU), true);
-        setEnabled(false);
-        DataSet.selListeners.add(this);
         listeners = new LinkedList<JosmAction>();
     }
@@ -131,6 +128,7 @@
     }
 
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        setEnabled(! newSelection.isEmpty());
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 1820)
@@ -73,4 +73,7 @@
 
     public void actionPerformed(ActionEvent e) {
+        if (!isEnabled())
+            return;
+
         int numberOfNodesInCircle = Main.pref.getInteger("createcircle.nodecount", 8);
         if (numberOfNodesInCircle < 1) {
@@ -265,3 +268,8 @@
         Main.map.repaint();
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/DeleteAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DeleteAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/DeleteAction.java	(revision 1820)
@@ -3,6 +3,4 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.util.Collection;
 
 import java.awt.event.ActionEvent;
@@ -11,25 +9,24 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.tools.Shortcut;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.SelectionChangedListener;
 
-public final class DeleteAction extends JosmAction implements SelectionChangedListener {
+public final class DeleteAction extends JosmAction {
 
     public DeleteAction() {
         super(tr("Delete"), "dialogs/delete", tr("Delete selected objects."),
-        Shortcut.registerShortcut("system:delete", tr("Edit: {0}", tr("Delete")), KeyEvent.VK_DELETE, Shortcut.GROUP_DIRECT), true);
-        DataSet.selListeners.add(this);
-        setEnabled(false);
+                Shortcut.registerShortcut("system:delete", tr("Edit: {0}", tr("Delete")), KeyEvent.VK_DELETE, Shortcut.GROUP_DIRECT), true);
     }
 
     public void actionPerformed(ActionEvent e) {
+        if (!isEnabled())
+            return;
         if(!Main.map.mapView.isActiveLayerVisible())
             return;
         new org.openstreetmap.josm.actions.mapmode.DeleteAction(Main.map)
-                .doActionPerformed(e);
+        .doActionPerformed(e);
     }
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        setEnabled(! newSelection.isEmpty());
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/DistributeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DistributeAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/DistributeAction.java	(revision 1820)
@@ -38,4 +38,6 @@
      */
     public void actionPerformed(ActionEvent e) {
+        if (!isEnabled())
+            return;
         Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
         Collection<Node> nodes = new LinkedList<Node>();
@@ -126,3 +128,8 @@
         Main.map.repaint();
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java	(revision 1820)
@@ -35,13 +35,9 @@
  *
  */
-public class DownloadReferrersAction extends JosmAction implements SelectionChangedListener, LayerChangeListener {
+public class DownloadReferrersAction extends JosmAction{
 
     public DownloadReferrersAction() {
         super(tr("Download referrers from OSM..."), "downloadreferrers", tr("Download primitives referring to one of the selected primitives"),
                 Shortcut.registerShortcut("file:downloadreferrers", tr("File: {0}", tr("Download referrers...")), KeyEvent.VK_D, Shortcut.GROUPS_ALT2+Shortcut.GROUP_HOTKEY), true);
-
-        Layer.listeners.add(this);
-        DataSet.selListeners.add(this);
-        refreshEnabled();
     }
 
@@ -168,32 +164,7 @@
      *
      */
-    protected void refreshEnabled() {
-        setEnabled(Main.map != null
-                && Main.map.mapView !=null
-                && Main.map.mapView.getEditLayer() != null
-                && ! Main.map.mapView.getEditLayer().data.getSelected().isEmpty()
-        );
-    }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface SelectionChangeListener                                                  */
-    /* ---------------------------------------------------------------------------------- */
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        refreshEnabled();
-    }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface LayerChangeListener                                                      */
-    /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/DuplicateAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DuplicateAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/DuplicateAction.java	(revision 1820)
@@ -7,14 +7,8 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
-import java.util.Collection;
 
-import org.openstreetmap.josm.data.SelectionChangedListener;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.Shortcut;
 
-public final class DuplicateAction extends JosmAction implements SelectionChangedListener, LayerChangeListener {
+public final class DuplicateAction extends JosmAction{
 
     public DuplicateAction() {
@@ -22,7 +16,4 @@
                 tr("Duplicate selection by copy and immediate paste."),
                 Shortcut.registerShortcut("system:duplicate", tr("Edit: {0}", tr("Duplicate")), KeyEvent.VK_D, Shortcut.GROUP_MENU), true);
-        setEnabled(false);
-        DataSet.selListeners.add(this);
-        Layer.listeners.add(this);
     }
 
@@ -32,30 +23,7 @@
 
 
-    protected void refreshEnabled() {
-        setEnabled(getCurrentDataSet() != null
-                && ! getCurrentDataSet().getSelected().isEmpty()
-        );
-    }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface SelectionChangeListener                                                  */
-    /* ---------------------------------------------------------------------------------- */
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        refreshEnabled();
-    }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface LayerChangeListener                                                      */
-    /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/GpxExportAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/GpxExportAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/GpxExportAction.java	(revision 1820)
@@ -32,5 +32,4 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.io.GpxWriter;
 import org.openstreetmap.josm.tools.GBC;
@@ -40,5 +39,5 @@
  * Exports data to gpx.
  */
-public class GpxExportAction extends DiskAccessAction implements LayerChangeListener {
+public class GpxExportAction extends DiskAccessAction {
 
     private final static String warningGpl = "<html><font color='red' size='-2'>"+tr("Note: GPL is not compatible with the OSM license. Do not upload GPL licensed tracks.")+"</html>";
@@ -47,6 +46,4 @@
         super(tr("Export to GPX..."), "exportgpx", tr("Export the data to GPX file."),
                 Shortcut.registerShortcut("file:exportgpx", tr("Export to GPX..."), KeyEvent.VK_E, Shortcut.GROUP_MENU));
-        Layer.listeners.add(this);
-        refreshEnabled();
     }
 
@@ -333,5 +330,6 @@
      * 
      */
-    protected void refreshEnabled() {
+    @Override
+    protected void updateEnabledState() {
         boolean check = Main.main != null
         && Main.map != null
@@ -345,18 +343,3 @@
         setEnabled(layer instanceof GpxLayer);
     }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface LayerChangeListener                                                      */
-    /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/HelpAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/HelpAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/HelpAction.java	(revision 1820)
@@ -12,5 +12,4 @@
 import java.awt.event.WindowEvent;
 import java.io.IOException;
-import java.io.StringReader;
 
 import javax.swing.AbstractAction;
@@ -64,10 +63,11 @@
                 if (e.getEventType() != HyperlinkEvent.EventType.ACTIVATED)
                     return;
-                if (e.getURL() == null)
+                if (e.getURL() == null) {
                     help.setText("<html>404 not found</html>");
-                else if (e.getURL().toString().endsWith("action=edit"))
+                } else if (e.getURL().toString().endsWith("action=edit")) {
                     OpenBrowser.displayUrl(e.getURL().toString());
-                else
+                } else {
                     setHelpUrl(e.getURL().toString());
+                }
             }
         });
@@ -119,11 +119,13 @@
             String topic = null;
             Point mouse = Main.parent.getMousePosition();
-            if (mouse != null)
+            if (mouse != null) {
                 topic = contextSensitiveHelp(SwingUtilities.getDeepestComponentAt(Main.parent, mouse.x, mouse.y));
+            }
             if (topic == null) {
                 helpBrowser.setVisible(false);
                 setHelpUrl(baseurl+pathbase+"Help");
-            } else
+            } else {
                 help(topic);
+            }
         } else {
             helpBrowser.setVisible(false);
@@ -176,6 +178,7 @@
             int i = pathbase.length()+baseurl.length();
             String title = url.substring(i);
-            if(languageCode.length() != 0 && !title.startsWith(languageCode))
+            if(languageCode.length() != 0 && !title.startsWith(languageCode)) {
                 title = languageCode + title;
+            }
             langurl = url.substring(0, i) + title;
         }
@@ -185,8 +188,10 @@
             loaded = loadHelpUrl(url, langurl, true);
         }
-        if(!loaded)
+        if(!loaded) {
             loaded = loadHelpUrl(url, langurl, false);
-        if(!loaded)
+        }
+        if(!loaded) {
             help.setText(tr("Error while loading page {0}",url));
+        }
         helpBrowser.setVisible(true);
     }
@@ -194,32 +199,32 @@
     private boolean loadHelpUrl(String url, String langurl, boolean lang)
     {
-      this.url = lang ? langurl : url;
-      boolean loaded = false;
-      try {
-          String txt = reader.read(this.url);
-          if(txt.length() == 0)
-          {
-              if(lang)
-                  throw new IOException();
-              else
-              {
-                if(url.equals(langurl))
-                {
-                    txt = ("<HTML>"+tr("Help page missing. Create it in <A HREF=\"{0}\">english</A>.",
-                    url+"?action=edit")+"</HTML>");
-                }
+        this.url = lang ? langurl : url;
+        boolean loaded = false;
+        try {
+            String txt = reader.read(this.url);
+            if(txt.length() == 0)
+            {
+                if(lang)
+                    throw new IOException();
                 else
                 {
-                    txt = ("<HTML>"+tr("Help page missing. Create it in <A HREF=\"{0}\">english</A> or <A HREF=\"{1}\">your language</A>.",
-                    url+"?action=edit", langurl+"?action=edit")+"</HTML>");
+                    if(url.equals(langurl))
+                    {
+                        txt = ("<HTML>"+tr("Help page missing. Create it in <A HREF=\"{0}\">english</A>.",
+                                url+"?action=edit")+"</HTML>");
+                    }
+                    else
+                    {
+                        txt = ("<HTML>"+tr("Help page missing. Create it in <A HREF=\"{0}\">english</A> or <A HREF=\"{1}\">your language</A>.",
+                                url+"?action=edit", langurl+"?action=edit")+"</HTML>");
+                    }
                 }
-              }
-          }
-          help.setText(txt);
-          help.setCaretPosition(0);
-          loaded = true;
-      } catch (IOException ex) {
-      }
-      return loaded;
+            }
+            help.setText(txt);
+            help.setCaretPosition(0);
+            loaded = true;
+        } catch (IOException ex) {
+        }
+        return loaded;
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 1820)
@@ -32,4 +32,6 @@
 
     public void actionPerformed(ActionEvent e) {
+        if (!isEnabled())
+            return;
         Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
         if (sel.size() != 1 || !(sel.iterator().next() instanceof Node)) return;
@@ -84,3 +86,8 @@
         Collections.reverse(is);
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 1820)
@@ -4,10 +4,16 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.Collection;
+
 import javax.swing.AbstractAction;
 import javax.swing.JComponent;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -16,5 +22,11 @@
 /**
  * Base class helper for all Actions in JOSM. Just to make the life easier.
- *
+ * 
+ * A JosmAction is a {@see LayerChangeListener} and a {@see SelectionChangedListener}. Upon
+ * a layer change event or a selection change event it invokes {@see #updateEnabled()}.
+ * Subclasses can override {@see #updateEnabled()} in order to update the {@see #isEnabled()}-state
+ * of a JosmAction depending on the {@see #getCurrentDataSet()} and the current layers
+ * (see also {@see #getEditLayer()}).
+ * 
  * destroy() from interface Destroyable is called e.g. for MapModes, when the last layer has
  * been removed and so the mapframe will be destroyed. For other JosmActions, destroy() may never
@@ -26,4 +38,6 @@
 
     protected Shortcut sc;
+    private LayerChangeAdapter layerChangeAdapter;
+    private SelectionChangeAdapter selectionChangeAdapter;
 
     public Shortcut getShortcut() {
@@ -65,4 +79,10 @@
             Main.toolbar.register(this);
         }
+        installAdapters();
+    }
+
+    public JosmAction() {
+        setHelpId();
+        installAdapters();
     }
 
@@ -72,9 +92,13 @@
             Main.contentPane.getActionMap().remove(sc.getKeyStroke());
         }
+        if (Layer.listeners != null) {
+            Layer.listeners.remove(layerChangeAdapter);
+        }
+        if (DataSet.selListeners != null) {
+            DataSet.selListeners.remove(selectionChangeAdapter);
+        }
     }
 
-    public JosmAction() {
-        setHelpId();
-    }
+
 
     /**
@@ -117,3 +141,55 @@
         return Main.main.getCurrentDataSet();
     }
+
+    private void installAdapters() {
+        // make this action listen to layer change and selection change events
+        //
+        layerChangeAdapter = new LayerChangeAdapter();
+        selectionChangeAdapter = new SelectionChangeAdapter();
+        Layer.listeners.add(layerChangeAdapter);
+        DataSet.selListeners.add(selectionChangeAdapter);
+        updateEnabledState();
+    }
+
+    /**
+     * 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 updateEnabledState() {
+        // override in subclasses
+    }
+
+    /**
+     * Adapter for layer change events
+     *
+     */
+    private class LayerChangeAdapter implements LayerChangeListener {
+        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+            updateEnabledState();
+        }
+
+        public void layerAdded(Layer newLayer) {
+            updateEnabledState();
+        }
+
+        public void layerRemoved(Layer oldLayer) {
+            updateEnabledState();
+        }
+    }
+
+    /**
+     * Adapter for selection change events
+     *
+     */
+    private class SelectionChangeAdapter implements SelectionChangedListener {
+        public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+            updateEnabledState();
+        }
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 1820)
@@ -29,6 +29,4 @@
 import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
-import org.openstreetmap.josm.data.SelectionChangedListener;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -51,13 +49,15 @@
  *
  */
-public class MergeNodesAction extends JosmAction implements SelectionChangedListener {
+public class MergeNodesAction extends JosmAction {
 
     public MergeNodesAction() {
         super(tr("Merge Nodes"), "mergenodes", tr("Merge nodes into the oldest one."),
                 Shortcut.registerShortcut("tools:mergenodes", tr("Tool: {0}", tr("Merge Nodes")), KeyEvent.VK_M, Shortcut.GROUP_EDIT), true);
-        DataSet.selListeners.add(this);
     }
 
     public void actionPerformed(ActionEvent event) {
+        if (!isEnabled())
+            return;
+
         Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
         LinkedList<Node> selectedNodes = new LinkedList<Node>();
@@ -295,11 +295,16 @@
      * Enable the "Merge Nodes" menu option if more then one node is selected
      */
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        boolean ok = true;
-        if (newSelection.size() < 2) {
+    @Override
+    public void updateEnabledState() {
+        if (getCurrentDataSet() == null || getCurrentDataSet().getSelected().isEmpty()) {
             setEnabled(false);
             return;
         }
-        for (OsmPrimitive osm : newSelection) {
+        boolean ok = true;
+        if (getCurrentDataSet().getSelected().size() < 2) {
+            setEnabled(false);
+            return;
+        }
+        for (OsmPrimitive osm : getCurrentDataSet().getSelected()) {
             if (!(osm instanceof Node)) {
                 ok = false;
Index: /trunk/src/org/openstreetmap/josm/actions/MirrorAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MirrorAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/MirrorAction.java	(revision 1820)
@@ -71,3 +71,8 @@
         Main.map.repaint();
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/MoveAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MoveAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/MoveAction.java	(revision 1820)
@@ -110,3 +110,8 @@
         Main.map.mapView.repaint();
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java	(revision 1820)
@@ -46,5 +46,6 @@
 
     public void actionPerformed(ActionEvent e) {
-
+        if (!isEnabled())
+            return;
         Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
 
@@ -278,3 +279,8 @@
         return heading_delta;
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/PasteAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/PasteAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/PasteAction.java	(revision 1820)
@@ -32,8 +32,9 @@
         super(tr("Paste"), "paste", tr("Paste contents of paste buffer."),
                 Shortcut.registerShortcut("system:paste", tr("Edit: {0}", tr("Paste")), KeyEvent.VK_V, Shortcut.GROUP_MENU), true);
-        setEnabled(false);
     }
 
     public void actionPerformed(ActionEvent e) {
+        if (!isEnabled())
+            return;
         pasteData(Main.pasteBuffer, Main.pasteSource, e);
     }
@@ -116,3 +117,19 @@
         Main.map.mapView.repaint();
     }
+
+    @Override
+    protected void updateEnabledState() {
+        if (getCurrentDataSet() == null || getCurrentDataSet().getSelected().isEmpty()) {
+            setEnabled(false);
+            return;
+        }
+        if (Main.pasteBuffer == null) {
+            setEnabled(false);
+        }
+        setEnabled(
+                !Main.pasteBuffer.nodes.isEmpty()
+                || !Main.pasteBuffer.ways.isEmpty()
+                || !Main.pasteBuffer.relations.isEmpty()
+        );
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 1820)
@@ -17,5 +17,4 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
-import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DataSource;
@@ -23,5 +22,5 @@
 import org.openstreetmap.josm.tools.Shortcut;
 
-public final class PasteTagsAction extends JosmAction implements SelectionChangedListener {
+public final class PasteTagsAction extends JosmAction {
 
     public PasteTagsAction(JosmAction copyAction) {
@@ -29,7 +28,5 @@
                 tr("Apply tags of contents of paste buffer to all selected items."),
                 Shortcut.registerShortcut("system:pastestyle", tr("Edit: {0}", tr("Paste Tags")), KeyEvent.VK_V, Shortcut.GROUP_MENU, Shortcut.SHIFT_DEFAULT), true);
-        DataSet.selListeners.add(this);
         copyAction.addListener(this);
-        setEnabled(false);
     }
 
@@ -125,6 +122,11 @@
     }
 
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        possiblyEnable(newSelection, Main.pasteBuffer);
+    @Override
+    protected void updateEnabledState() {
+        if (getCurrentDataSet() == null || Main.pasteBuffer == null) {
+            setEnabled(false);
+            return;
+        }
+        possiblyEnable(getCurrentDataSet().getSelected(), Main.pasteBuffer);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/RedoAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/RedoAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/RedoAction.java	(revision 1820)
@@ -22,5 +22,5 @@
     public RedoAction() {
         super(tr("Redo"), "redo", tr("Redo the last undone action."),
-        Shortcut.registerShortcut("system:redo", tr("Edit: {0}", tr("Redo")), KeyEvent.VK_Y, Shortcut.GROUP_MENU), true);
+                Shortcut.registerShortcut("system:redo", tr("Edit: {0}", tr("Redo")), KeyEvent.VK_Y, Shortcut.GROUP_MENU), true);
         setEnabled(false);
     }
@@ -32,3 +32,8 @@
         Main.main.undoRedo.redo();
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(Main.map != null);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java	(revision 1820)
@@ -18,39 +18,34 @@
 import org.openstreetmap.josm.corrector.ReverseWayTagCorrector;
 import org.openstreetmap.josm.corrector.UserCancelException;
+import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.Shortcut;
 
-public final class ReverseWayAction extends JosmAction {
+public final class ReverseWayAction extends JosmAction implements SelectionChangedListener, LayerChangeListener {
 
     public ReverseWayAction() {
         super(tr("Reverse Ways"), "wayflip", tr("Reverse the direction of all selected ways."),
                 Shortcut.registerShortcut("tools:reverse", tr("Tool: {0}", tr("Reverse Ways")), KeyEvent.VK_R, Shortcut.GROUP_EDIT), true);
+        DataSet.selListeners.add(this);
+        Layer.listeners.add(this);
+        refreshEnabled();
     }
 
     public void actionPerformed(ActionEvent e) {
+        if (! isEnabled())
+            return;
+        if (getCurrentDataSet() == null)
+            return;
+
         final Collection<Way> sel = new LinkedList<Way>();
-        new AbstractVisitor() {
-            public void visit(Node n) {
+        for (OsmPrimitive primitive : getCurrentDataSet().getSelected()) {
+            if (primitive instanceof Way) {
+                sel.add((Way)primitive);
             }
-
-            public void visit(Way w) {
-                sel.add(w);
-            }
-
-            public void visit(Relation e) {
-            }
-
-            public void visitAll() {
-                for (OsmPrimitive osm : getCurrentDataSet().getSelected()) {
-                    osm.visit(this);
-                }
-            }
-        }.visitAll();
-
+        }
         if (sel.isEmpty()) {
             JOptionPane.showMessageDialog(Main.parent,
@@ -86,3 +81,35 @@
         Main.map.repaint();
     }
+
+    protected int getNumWaysInSelection() {
+        if (getCurrentDataSet() == null) return 0;
+        int ret = 0;
+        for (OsmPrimitive primitive : getCurrentDataSet().getSelected()) {
+            if (primitive instanceof Way) {
+                ret++;
+            }
+        }
+        return ret;
+    }
+
+    protected void refreshEnabled() {
+        setEnabled(getNumWaysInSelection() > 0);
+    }
+
+    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+        refreshEnabled();
+    }
+
+    public void layerAdded(Layer newLayer) {
+        refreshEnabled();
+
+    }
+
+    public void layerRemoved(Layer oldLayer) {
+        refreshEnabled();
+    }
+
+    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+        refreshEnabled();
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 1820)
@@ -26,5 +26,4 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.io.GpxImporter;
 import org.openstreetmap.josm.io.GpxWriter;
@@ -35,10 +34,8 @@
 import org.openstreetmap.josm.tools.Shortcut;
 
-public abstract class SaveActionBase extends DiskAccessAction implements LayerChangeListener {
+public abstract class SaveActionBase extends DiskAccessAction {
 
     public SaveActionBase(String name, String iconName, String tooltip, Shortcut shortcut) {
         super(name, iconName, tooltip, shortcut);
-        Layer.listeners.add(this);
-        refreshEnabled();
     }
 
@@ -275,7 +272,7 @@
      * 
      */
-    protected void refreshEnabled() {
-        boolean check = Main.main != null
-        && Main.map != null
+    @Override
+    protected void updateEnabledState() {
+        boolean check =  Main.map != null
         && Main.map.mapView !=null
         && Main.map.mapView.getActiveLayer() != null;
@@ -287,19 +284,3 @@
         setEnabled(layer instanceof OsmDataLayer || layer instanceof GpxLayer);
     }
-
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface LayerChangeListener                                                      */
-    /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/SelectAllAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SelectAllAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/SelectAllAction.java	(revision 1820)
@@ -11,11 +11,9 @@
 import org.openstreetmap.josm.tools.Shortcut;
 
-public class SelectAllAction extends JosmAction implements LayerChangeListener{
+public class SelectAllAction extends JosmAction {
 
     public SelectAllAction() {
         super(tr("Select All"),"selectall", tr("Select all undeleted objects in the data layer. This selects incomplete objects too."),
                 Shortcut.registerShortcut("system:selectall", tr("Edit: {0}", tr("Select All")), KeyEvent.VK_A, Shortcut.GROUP_MENU), true);
-        Layer.listeners.add(this);
-        refreshEnabled();
     }
 
@@ -30,21 +28,7 @@
      * 
      */
-    protected void refreshEnabled() {
+    @Override
+    protected void updateEnabledState() {
         setEnabled(getEditLayer() != null);
     }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface LayerChangeListener                                                      */
-    /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 1820)
@@ -34,4 +34,6 @@
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
 import org.openstreetmap.josm.gui.PrimitiveNameFormatter;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -43,5 +45,5 @@
  */
 
-public class SplitWayAction extends JosmAction implements SelectionChangedListener {
+public class SplitWayAction extends JosmAction {
 
     private Way selectedWay;
@@ -54,5 +56,4 @@
         super(tr("Split Way"), "splitway", tr("Split a way at the selected node."),
                 Shortcut.registerShortcut("tools:splitway", tr("Tool: {0}", tr("Split Way")), KeyEvent.VK_P, Shortcut.GROUP_EDIT), true);
-        DataSet.selListeners.add(this);
     }
 
@@ -337,9 +338,11 @@
     }
 
-    /**
-     * Enable the "split way" menu option if the selection looks like we could use it.
-     */
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        setEnabled(checkSelection(newSelection));
+    @Override
+    protected void updateEnabledState() {
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+            return;
+        }
+        setEnabled(checkSelection(getCurrentDataSet().getSelected()));
     }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 1820)
@@ -39,5 +39,5 @@
  */
 
-public class UnGlueAction extends JosmAction { //implements SelectionChangedListener {
+public class UnGlueAction extends JosmAction {
 
     private Node selectedNode;
@@ -51,5 +51,4 @@
         super(tr("UnGlue Ways"), "unglueways", tr("Duplicate nodes that are used by multiple ways."),
                 Shortcut.registerShortcut("tools:unglue", tr("Tool: {0}", tr("UnGlue Ways")), KeyEvent.VK_G, Shortcut.GROUP_EDIT), true);
-        //DataSet.selListeners.add(this);
     }
 
@@ -410,3 +409,8 @@
         getCurrentDataSet().setSelected(allNewNodes);
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/UndoAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UndoAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/UndoAction.java	(revision 1820)
@@ -22,5 +22,5 @@
     public UndoAction() {
         super(tr("Undo"), "undo", tr("Undo the last action."),
-        Shortcut.registerShortcut("system:undo", tr("Edit: {0}", tr("Undo")), KeyEvent.VK_Z, Shortcut.GROUP_MENU), true);
+                Shortcut.registerShortcut("system:undo", tr("Edit: {0}", tr("Undo")), KeyEvent.VK_Z, Shortcut.GROUP_MENU), true);
         setEnabled(false);
     }
@@ -32,3 +32,8 @@
         Main.main.undoRedo.undo();
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(Main.map != null);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java	(revision 1820)
@@ -13,5 +13,5 @@
 import org.openstreetmap.josm.tools.Shortcut;
 
-public class UnselectAllAction extends JosmAction implements LayerChangeListener {
+public class UnselectAllAction extends JosmAction {
 
     public UnselectAllAction() {
@@ -37,6 +37,4 @@
                         KeyEvent.VK_ESCAPE, Shortcut.GROUP_DIRECT).getKeyStroke(),
                         tr("Unselect All"));
-        Layer.listeners.add(this);
-        refreshEnabled();
     }
 
@@ -50,21 +48,7 @@
      * 
      */
-    protected void refreshEnabled() {
+    @Override
+    protected void updateEnabledState() {
         setEnabled(getEditLayer() != null);
     }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface LayerChangeListener                                                      */
-    /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java	(revision 1820)
@@ -16,9 +16,8 @@
 import org.openstreetmap.josm.data.osm.DataSource;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.Shortcut;
 
-public class UpdateDataAction extends JosmAction implements LayerChangeListener{
+public class UpdateDataAction extends JosmAction{
     public UpdateDataAction() {
         super(tr("Update Data"),
@@ -30,6 +29,4 @@
                         Shortcut.GROUP_HOTKEY),
                         true);
-        refreshEnabled();
-        Layer.listeners.add(this);
     }
 
@@ -38,5 +35,6 @@
      * 
      */
-    protected void refreshEnabled() {
+    @Override
+    protected void updateEnabledState() {
         setEnabled(getEditLayer() != null);
     }
@@ -86,18 +84,3 @@
         new DownloadOsmTaskList().download(false, areas);
     }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface LayerChangeListener                                                      */
-    /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java	(revision 1820)
@@ -33,5 +33,5 @@
  *
  */
-public class UpdateSelectionAction extends JosmAction implements SelectionChangedListener, LayerChangeListener {
+public class UpdateSelectionAction extends JosmAction {
 
     /**
@@ -184,7 +184,4 @@
                         Shortcut.GROUP_HOTKEY + Shortcut.GROUPS_ALT2),
                         true);
-        refreshEnabled();
-        Layer.listeners.add(this);
-        DataSet.selListeners.add(this);
     }
 
@@ -193,5 +190,6 @@
      *
      */
-    protected void refreshEnabled() {
+    @Override
+    protected void updateEnabledState() {
         setEnabled(getCurrentDataSet() != null
                 && ! getCurrentDataSet().getSelected().isEmpty()
@@ -217,19 +215,3 @@
         updatePrimitives(selection);
     }
-
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        refreshEnabled();
-    }
-
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 1820)
@@ -29,6 +29,4 @@
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.historycombobox.SuggestingJHistoryComboBox;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.OsmApi;
@@ -51,5 +49,5 @@
  * @author imi
  */
-public class UploadAction extends JosmAction implements LayerChangeListener{
+public class UploadAction extends JosmAction{
     static private Logger logger = Logger.getLogger(UploadAction.class.getName());
 
@@ -155,7 +153,4 @@
             }
         });
-
-        Layer.listeners.add(this);
-        refreshEnabled();
     }
 
@@ -164,13 +159,12 @@
      *
      */
-    protected void refreshEnabled() {
-        setEnabled(Main.main != null
-                && Main.map != null
-                && Main.map.mapView !=null
-                && Main.map.mapView.getEditLayer() != null
-        );
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(getEditLayer() != null);
     }
 
     public void actionPerformed(ActionEvent e) {
+        if (!isEnabled())
+            return;
         if (Main.map == null) {
             JOptionPane.showMessageDialog(Main.parent,tr("Nothing to upload. Get some data first."));
@@ -600,18 +594,3 @@
         e.printStackTrace();
     }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface LayerChangeListener                                                      */
-    /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/ZoomInAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ZoomInAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/ZoomInAction.java	(revision 1820)
@@ -14,5 +14,5 @@
     public ZoomInAction() {
         super(tr("Zoom In"), "dialogs/zoomin", tr("Zoom In"),
-        Shortcut.registerShortcut("view:zoomin", tr("View: {0}", tr("Zoom In")), KeyEvent.VK_PLUS, Shortcut.GROUP_DIRECT), true);
+                Shortcut.registerShortcut("view:zoomin", tr("View: {0}", tr("Zoom In")), KeyEvent.VK_PLUS, Shortcut.GROUP_DIRECT), true);
         setEnabled(true);
     }
Index: /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 1820)
@@ -23,10 +23,8 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Shortcut;
 
-public class SearchAction extends JosmAction implements LayerChangeListener{
+public class SearchAction extends JosmAction{
 
     public static final int SEARCH_HISTORY_SIZE = 10;
@@ -43,6 +41,4 @@
         super(tr("Search..."), "dialogs/search", tr("Search for objects."),
                 Shortcut.registerShortcut("system:find", tr("Search..."), KeyEvent.VK_F, Shortcut.GROUP_HOTKEY), true);
-        Layer.listeners.add(this);
-        refreshEnabled();
     }
 
@@ -240,21 +236,7 @@
      * 
      */
-    protected void refreshEnabled() {
+    @Override
+    protected void updateEnabledState() {
         setEnabled(getEditLayer() != null);
     }
-
-    /* ---------------------------------------------------------------------------------- */
-    /* Interface LayerChangeListener                                                      */
-    /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerAdded(Layer newLayer) {
-        refreshEnabled();
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        refreshEnabled();
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 1819)
+++ /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 1820)
@@ -183,5 +183,5 @@
         if(activeLayer != null && activeLayer instanceof OsmDataLayer)
             return ((OsmDataLayer)activeLayer).data;
-        return new DataSet();
+        return null;
     }
 
