Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java	(revision 10210)
@@ -17,5 +17,4 @@
 import java.util.List;
 import java.util.Map;
-import java.util.Observable;
 import java.util.Set;
 
@@ -36,4 +35,5 @@
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -72,5 +72,5 @@
  * @see ListMerger
  */
-public abstract class ListMergeModel<T extends PrimitiveId> extends Observable {
+public abstract class ListMergeModel<T extends PrimitiveId> extends ChangeNotifier {
     public static final String FROZEN_PROP = ListMergeModel.class.getName() + ".frozen";
 
@@ -270,6 +270,5 @@
         theirEntriesTableModel.fireTableDataChanged();
         mergedEntriesTableModel.fireTableDataChanged();
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
@@ -458,5 +457,5 @@
         copy(source, rows, current + 1);
         mergedEntriesSelectionModel.setSelectionInterval(current+1, current + rows.length-1);
-        notifyObservers();
+        fireStateChanged();
     }
 
@@ -505,5 +504,4 @@
         }
         fireModelDataChanged();
-        notifyObservers();
         mergedEntriesSelectionModel.clearSelection();
         for (int row: rows) {
@@ -532,5 +530,4 @@
         }
         fireModelDataChanged();
-        notifyObservers();
         mergedEntriesSelectionModel.clearSelection();
         for (int row: rows) {
@@ -555,5 +552,4 @@
         }
         fireModelDataChanged();
-        notifyObservers();
         mergedEntriesSelectionModel.clearSelection();
     }
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java	(revision 10210)
@@ -15,6 +15,4 @@
 import java.beans.PropertyChangeListener;
 import java.util.Collection;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.AbstractAction;
@@ -28,4 +26,6 @@
 import javax.swing.JTable;
 import javax.swing.JToggleButton;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
@@ -49,5 +49,5 @@
  * @since 1631
  */
-public abstract class ListMerger<T extends PrimitiveId> extends JPanel implements PropertyChangeListener, Observer, IConflictResolver {
+public abstract class ListMerger<T extends PrimitiveId> extends JPanel implements PropertyChangeListener, ChangeListener, IConflictResolver {
     protected OsmPrimitivesTable myEntriesTable;
     protected OsmPrimitivesTable mergedEntriesTable;
@@ -120,6 +120,6 @@
         mergedEntriesTable.getSelectionModel().addListSelectionListener(removeMergedAction);
 
-        model.addObserver(copyAllLeft);
-        model.addObserver(copyAllRight);
+        model.addChangeListener(copyAllLeft);
+        model.addChangeListener(copyAllRight);
         model.addPropertyChangeListener(copyAllLeft);
         model.addPropertyChangeListener(copyAllRight);
@@ -408,5 +408,5 @@
     public ListMerger(ListMergeModel<T> model) {
         this.model = model;
-        model.addObserver(this);
+        model.addChangeListener(this);
         build();
         model.addPropertyChangeListener(this);
@@ -621,5 +621,5 @@
     }
 
-    class CopyAllLeft extends AbstractAction implements Observer, PropertyChangeListener {
+    class CopyAllLeft extends AbstractAction implements ChangeListener, PropertyChangeListener {
 
         CopyAllLeft() {
@@ -640,5 +640,5 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             updateEnabledState();
         }
@@ -650,5 +650,5 @@
     }
 
-    class CopyAllRight extends AbstractAction implements Observer, PropertyChangeListener {
+    class CopyAllRight extends AbstractAction implements ChangeListener, PropertyChangeListener {
 
         CopyAllRight() {
@@ -669,5 +669,5 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             updateEnabledState();
         }
@@ -871,5 +871,5 @@
 
     @Override
-    public void update(Observable o, Object arg) {
+    public void stateChanged(ChangeEvent e) {
         lblMyVersion.setText(
                 trn("My version ({0} entry)", "My version ({0} entries)", model.getMyEntriesSize(), model.getMyEntriesSize())
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java	(revision 10210)
@@ -9,5 +9,4 @@
 import java.util.Collections;
 import java.util.List;
-import java.util.Observable;
 
 import org.openstreetmap.josm.command.Command;
@@ -19,4 +18,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
@@ -26,5 +26,5 @@
  * the deleted or visible state of {@link OsmPrimitive}s.
  *
- * This model is an {@link Observable}. It notifies registered {@link java.util.Observer}s whenever the
+ * This model is a {@link ChangeNotifier}. It notifies registered {@link javax.swing.event.ChangeListener}s whenever the
  * internal state changes.
  *
@@ -37,5 +37,5 @@
  *
  */
-public class PropertiesMergeModel extends Observable {
+public class PropertiesMergeModel extends ChangeNotifier {
 
     public static final String RESOLVED_COMPLETELY_PROP = PropertiesMergeModel.class.getName() + ".resolvedCompletely";
@@ -145,6 +145,5 @@
         coordMergeDecision = UNDECIDED;
         deletedMergeDecision = UNDECIDED;
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
         fireCompletelyResolved();
     }
@@ -196,6 +195,5 @@
     public void decideCoordsConflict(MergeDecisionType decision) {
         coordMergeDecision = decision;
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
         fireCompletelyResolved();
     }
@@ -271,6 +269,5 @@
 
         this.deletedMergeDecision = decision;
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
         fireCompletelyResolved();
 
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java	(revision 10210)
@@ -10,6 +10,4 @@
 import java.text.DecimalFormat;
 import java.util.List;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.AbstractAction;
@@ -19,4 +17,6 @@
 import javax.swing.JLabel;
 import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.data.conflict.Conflict;
@@ -34,5 +34,5 @@
  * @since 1654
  */
-public class PropertiesMerger extends JPanel implements Observer, IConflictResolver {
+public class PropertiesMerger extends JPanel implements ChangeListener, IConflictResolver {
     private static final DecimalFormat COORD_FORMATTER = new DecimalFormat("###0.0000000");
 
@@ -57,5 +57,5 @@
     public PropertiesMerger() {
         model = new PropertiesMergeModel();
-        model.addObserver(this);
+        model.addChangeListener(this);
         build();
     }
@@ -137,5 +137,5 @@
         gc.weighty = 0.0;
         KeepMyCoordinatesAction actKeepMyCoordinates = new KeepMyCoordinatesAction();
-        model.addObserver(actKeepMyCoordinates);
+        model.addChangeListener(actKeepMyCoordinates);
         JButton btnKeepMyCoordinates = new JButton(actKeepMyCoordinates);
         btnKeepMyCoordinates.setName("button.keepmycoordinates");
@@ -155,5 +155,5 @@
         gc.weighty = 0.0;
         KeepTheirCoordinatesAction actKeepTheirCoordinates = new KeepTheirCoordinatesAction();
-        model.addObserver(actKeepTheirCoordinates);
+        model.addChangeListener(actKeepTheirCoordinates);
         JButton btnKeepTheirCoordinates = new JButton(actKeepTheirCoordinates);
         add(btnKeepTheirCoordinates, gc);
@@ -174,5 +174,5 @@
         gc.weighty = 0.0;
         UndecideCoordinateConflictAction actUndecideCoordinates = new UndecideCoordinateConflictAction();
-        model.addObserver(actUndecideCoordinates);
+        model.addChangeListener(actUndecideCoordinates);
         JButton btnUndecideCoordinates = new JButton(actUndecideCoordinates);
         add(btnUndecideCoordinates, gc);
@@ -206,5 +206,5 @@
         gc.weighty = 0.0;
         KeepMyDeletedStateAction actKeepMyDeletedState = new KeepMyDeletedStateAction();
-        model.addObserver(actKeepMyDeletedState);
+        model.addChangeListener(actKeepMyDeletedState);
         JButton btnKeepMyDeletedState = new JButton(actKeepMyDeletedState);
         btnKeepMyDeletedState.setName("button.keepmydeletedstate");
@@ -224,5 +224,5 @@
         gc.weighty = 0.0;
         KeepTheirDeletedStateAction actKeepTheirDeletedState = new KeepTheirDeletedStateAction();
-        model.addObserver(actKeepTheirDeletedState);
+        model.addChangeListener(actKeepTheirDeletedState);
         JButton btnKeepTheirDeletedState = new JButton(actKeepTheirDeletedState);
         btnKeepTheirDeletedState.setName("button.keeptheirdeletedstate");
@@ -244,5 +244,5 @@
         gc.weighty = 0.0;
         UndecideDeletedStateConflictAction actUndecideDeletedState = new UndecideDeletedStateConflictAction();
-        model.addObserver(actUndecideDeletedState);
+        model.addChangeListener(actUndecideDeletedState);
         JButton btnUndecideDeletedState = new JButton(actUndecideDeletedState);
         btnUndecideDeletedState.setName("button.undecidedeletedstate");
@@ -384,5 +384,5 @@
 
     @Override
-    public void update(Observable o, Object arg) {
+    public void stateChanged(ChangeEvent e) {
         updateCoordinates();
         updateDeletedState();
@@ -398,5 +398,5 @@
     }
 
-    class KeepMyCoordinatesAction extends AbstractAction implements Observer {
+    class KeepMyCoordinatesAction extends AbstractAction implements ChangeListener {
         KeepMyCoordinatesAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagkeepmine"));
@@ -410,10 +410,10 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasCoordConflict() && !model.isDecidedCoord() && model.getMyCoords() != null);
         }
     }
 
-    class KeepTheirCoordinatesAction extends AbstractAction implements Observer {
+    class KeepTheirCoordinatesAction extends AbstractAction implements ChangeListener {
         KeepTheirCoordinatesAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagkeeptheir"));
@@ -427,10 +427,10 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasCoordConflict() && !model.isDecidedCoord() && model.getTheirCoords() != null);
         }
     }
 
-    class UndecideCoordinateConflictAction extends AbstractAction implements Observer {
+    class UndecideCoordinateConflictAction extends AbstractAction implements ChangeListener {
         UndecideCoordinateConflictAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagundecide"));
@@ -444,10 +444,10 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasCoordConflict() && model.isDecidedCoord());
         }
     }
 
-    class KeepMyDeletedStateAction extends AbstractAction implements Observer {
+    class KeepMyDeletedStateAction extends AbstractAction implements ChangeListener {
         KeepMyDeletedStateAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagkeepmine"));
@@ -461,10 +461,10 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasDeletedStateConflict() && !model.isDecidedDeletedState());
         }
     }
 
-    class KeepTheirDeletedStateAction extends AbstractAction implements Observer {
+    class KeepTheirDeletedStateAction extends AbstractAction implements ChangeListener {
         KeepTheirDeletedStateAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagkeeptheir"));
@@ -478,10 +478,10 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasDeletedStateConflict() && !model.isDecidedDeletedState());
         }
     }
 
-    class UndecideDeletedStateConflictAction extends AbstractAction implements Observer {
+    class UndecideDeletedStateConflictAction extends AbstractAction implements ChangeListener {
         UndecideDeletedStateConflictAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagundecide"));
@@ -495,5 +495,5 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasDeletedStateConflict() && model.isDecidedDeletedState());
         }
Index: trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java	(revision 10210)
@@ -20,6 +20,4 @@
 import java.nio.charset.StandardCharsets;
 import java.util.Locale;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.AbstractAction;
@@ -35,4 +33,6 @@
 import javax.swing.KeyStroke;
 import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
@@ -495,5 +495,5 @@
     }
 
-    static class BackAction extends AbstractBrowserAction implements Observer {
+    static class BackAction extends AbstractBrowserAction implements ChangeListener {
 
         /**
@@ -503,5 +503,5 @@
         BackAction(IHelpBrowser browser) {
             super(browser);
-            browser.getHistory().addObserver(this);
+            browser.getHistory().addChangeListener(this);
             putValue(SHORT_DESCRIPTION, tr("Go to the previous page"));
             putValue(SMALL_ICON, ImageProvider.get("help", "previous"));
@@ -515,10 +515,10 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(browser.getHistory().canGoBack());
         }
     }
 
-    static class ForwardAction extends AbstractBrowserAction implements Observer {
+    static class ForwardAction extends AbstractBrowserAction implements ChangeListener {
 
         /**
@@ -528,5 +528,5 @@
         ForwardAction(IHelpBrowser browser) {
             super(browser);
-            browser.getHistory().addObserver(this);
+            browser.getHistory().addChangeListener(this);
             putValue(SHORT_DESCRIPTION, tr("Go to the next page"));
             putValue(SMALL_ICON, ImageProvider.get("help", "next"));
@@ -540,5 +540,5 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(browser.getHistory().canGoForward());
         }
Index: trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserHistory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserHistory.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserHistory.java	(revision 10210)
@@ -5,5 +5,6 @@
 import java.util.Collections;
 import java.util.List;
-import java.util.Observable;
+
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 
 /**
@@ -11,5 +12,5 @@
  * @since 2274
  */
-public class HelpBrowserHistory extends Observable {
+public class HelpBrowserHistory extends ChangeNotifier {
     private final IHelpBrowser browser;
     private List<String> history;
@@ -31,6 +32,5 @@
         history.clear();
         historyPos = 0;
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
@@ -60,6 +60,5 @@
         String url = history.get(historyPos);
         browser.openUrl(url);
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
@@ -73,6 +72,5 @@
         String url = history.get(historyPos);
         browser.openUrl(url);
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
@@ -99,6 +97,5 @@
             historyPos = history.size()-1;
         }
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 10210)
@@ -7,6 +7,4 @@
 import java.awt.GridBagLayout;
 import java.awt.Insets;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.BorderFactory;
@@ -14,4 +12,6 @@
 import javax.swing.JPanel;
 import javax.swing.UIManager;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.gui.jmapviewer.JMapViewer;
@@ -127,46 +127,46 @@
         setModel(model);
         build();
-        registerAsObserver(model);
-    }
-
-    protected void unregisterAsObserver(HistoryBrowserModel model) {
+        registerAsChangeListener(model);
+    }
+
+    protected void unregisterAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.deleteObserver(currentInfoPanel);
+            model.removeChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.deleteObserver(referenceInfoPanel);
+            model.removeChangeListener(referenceInfoPanel);
         }
         if (currentLatLonViewer != null) {
-            model.deleteObserver(currentLatLonViewer);
+            model.removeChangeListener(currentLatLonViewer);
         }
         if (referenceLatLonViewer != null) {
-            model.deleteObserver(referenceLatLonViewer);
+            model.removeChangeListener(referenceLatLonViewer);
         }
         if (distanceViewer != null) {
-            model.deleteObserver(distanceViewer);
+            model.removeChangeListener(distanceViewer);
         }
         if (mapViewer != null) {
-            model.deleteObserver(mapViewer);
-        }
-    }
-
-    protected void registerAsObserver(HistoryBrowserModel model) {
+            model.removeChangeListener(mapViewer);
+        }
+    }
+
+    protected void registerAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.addObserver(currentInfoPanel);
+            model.addChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.addObserver(referenceInfoPanel);
+            model.addChangeListener(referenceInfoPanel);
         }
         if (currentLatLonViewer != null) {
-            model.addObserver(currentLatLonViewer);
+            model.addChangeListener(currentLatLonViewer);
         }
         if (referenceLatLonViewer != null) {
-            model.addObserver(referenceLatLonViewer);
+            model.addChangeListener(referenceLatLonViewer);
         }
         if (distanceViewer != null) {
-            model.addObserver(distanceViewer);
+            model.addChangeListener(distanceViewer);
         }
         if (mapViewer != null) {
-            model.addObserver(mapViewer);
+            model.addChangeListener(mapViewer);
         }
     }
@@ -179,9 +179,9 @@
     public void setModel(HistoryBrowserModel model) {
         if (this.model != null) {
-            unregisterAsObserver(model);
+            unregisterAsChangeListener(model);
         }
         this.model = model;
         if (this.model != null) {
-            registerAsObserver(model);
+            registerAsChangeListener(model);
         }
     }
@@ -241,5 +241,5 @@
      * A UI widgets which displays the Lan/Lon-coordinates of a {@link HistoryNode}.
      */
-    private static class LatLonViewer extends JPanel implements Observer {
+    private static class LatLonViewer extends JPanel implements ChangeListener {
 
         private final JosmTextArea lblLat = newTextArea();
@@ -324,10 +324,10 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             refresh();
         }
     }
 
-    private static class MapViewer extends JMapViewer implements Observer {
+    private static class MapViewer extends JMapViewer implements ChangeListener {
 
         private final Updater updater;
@@ -339,5 +339,5 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             final Pair<LatLon, LatLon> coordinates = updater.getCoordinates();
             if (coordinates == null) {
@@ -362,5 +362,5 @@
     }
 
-    private static class DistanceViewer extends JPanel implements Observer {
+    private static class DistanceViewer extends JPanel implements ChangeListener {
 
         private final JosmTextArea lblDistance = newTextArea();
@@ -417,5 +417,5 @@
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             refresh();
         }
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 10210)
@@ -9,5 +9,4 @@
 import java.util.HashSet;
 import java.util.List;
-import java.util.Observable;
 import java.util.Set;
 
@@ -46,4 +45,5 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.date.DateUtils;
@@ -74,5 +74,5 @@
  * @see HistoryBrowser
  */
-public class HistoryBrowserModel extends Observable implements LayerChangeListener, DataSetListener {
+public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeListener, DataSetListener {
     /** the history of an OsmPrimitive */
     private History history;
@@ -198,6 +198,5 @@
         initNodeListTableModels();
         initMemberListTableModels();
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
         versionTableModel.fireTableDataChanged();
     }
@@ -317,6 +316,5 @@
         initNodeListTableModels();
         initMemberListTableModels();
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
@@ -348,6 +346,5 @@
         initNodeListTableModels();
         initMemberListTableModels();
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java	(revision 10210)
@@ -41,27 +41,27 @@
     public final void setModel(HistoryBrowserModel model) {
         if (this.model != null) {
-            unregisterAsObserver(model);
+            unregisterAsChangeListener(model);
         }
         this.model = model;
         if (this.model != null) {
-            registerAsObserver(model);
+            registerAsChangeListener(model);
         }
     }
 
-    protected final void unregisterAsObserver(HistoryBrowserModel model) {
+    protected final void unregisterAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.deleteObserver(currentInfoPanel);
+            model.removeChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.deleteObserver(referenceInfoPanel);
+            model.removeChangeListener(referenceInfoPanel);
         }
     }
 
-    protected final void registerAsObserver(HistoryBrowserModel model) {
+    protected final void registerAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.addObserver(currentInfoPanel);
+            model.addChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.addObserver(referenceInfoPanel);
+            model.addChangeListener(referenceInfoPanel);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 10210)
@@ -173,19 +173,19 @@
     }
 
-    protected void unregisterAsObserver(HistoryBrowserModel model) {
+    protected void unregisterAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.deleteObserver(currentInfoPanel);
+            model.removeChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.deleteObserver(referenceInfoPanel);
-        }
-    }
-
-    protected void registerAsObserver(HistoryBrowserModel model) {
+            model.removeChangeListener(referenceInfoPanel);
+        }
+    }
+
+    protected void registerAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.addObserver(currentInfoPanel);
+            model.addChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.addObserver(referenceInfoPanel);
+            model.addChangeListener(referenceInfoPanel);
         }
     }
@@ -197,9 +197,9 @@
     public void setModel(HistoryBrowserModel model) {
         if (this.model != null) {
-            unregisterAsObserver(model);
+            unregisterAsChangeListener(model);
         }
         this.model = model;
         if (this.model != null) {
-            registerAsObserver(model);
+            registerAsChangeListener(model);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 10210)
@@ -15,6 +15,4 @@
 import java.util.Collections;
 import java.util.Date;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.AbstractAction;
@@ -24,4 +22,6 @@
 import javax.swing.JPanel;
 import javax.swing.JTextArea;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.Main;
@@ -48,5 +48,5 @@
  * @since 1709
  */
-public class VersionInfoPanel extends JPanel implements Observer {
+public class VersionInfoPanel extends JPanel implements ChangeListener {
     private final PointInTimeType pointInTimeType;
     private final transient HistoryBrowserModel model;
@@ -189,5 +189,5 @@
         this.model = model;
         this.pointInTimeType = pointInTimeType;
-        model.addObserver(this);
+        model.addChangeListener(this);
         build();
     }
@@ -198,5 +198,5 @@
 
     @Override
-    public void update(Observable o, Object arg) {
+    public void stateChanged(ChangeEvent e) {
         HistoryOsmPrimitive primitive = getPrimitive();
         if (primitive != null) {
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 10210)
@@ -14,6 +14,4 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.DefaultCellEditor;
@@ -25,4 +23,6 @@
 import javax.swing.SwingConstants;
 import javax.swing.UIManager;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.TableModelEvent;
 import javax.swing.event.TableModelListener;
@@ -45,5 +45,5 @@
  * @since 1709
  */
-public class VersionTable extends JTable implements Observer {
+public class VersionTable extends JTable implements ChangeListener {
     private VersionTablePopupMenu popupMenu;
     private final transient HistoryBrowserModel model;
@@ -55,5 +55,5 @@
     public VersionTable(HistoryBrowserModel model) {
         super(model.getVersionTableModel(), new VersionTableColumnModel());
-        model.addObserver(this);
+        model.addChangeListener(this);
         build();
         this.model = model;
@@ -117,5 +117,5 @@
 
     @Override
-    public void update(Observable o, Object arg) {
+    public void stateChanged(ChangeEvent e) {
         repaint();
     }
Index: trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 10210)
@@ -16,6 +16,4 @@
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.Action;
@@ -23,4 +21,6 @@
 import javax.swing.JEditorPane;
 import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
@@ -122,6 +122,6 @@
         this.changesetCommentModel = changesetCommentModel;
         this.changesetSourceModel = changesetSourceModel;
-        changesetCommentModel.addObserver(new ChangesetCommentObserver(hcbUploadComment));
-        changesetSourceModel.addObserver(new ChangesetCommentObserver(hcbUploadSource));
+        changesetCommentModel.addChangeListener(new ChangesetCommentChangeListener(hcbUploadComment));
+        changesetSourceModel.addChangeListener(new ChangesetCommentChangeListener(hcbUploadSource));
         build();
     }
@@ -215,16 +215,16 @@
      * in sync with the current changeset comment
      */
-    static class ChangesetCommentObserver implements Observer {
+    static class ChangesetCommentChangeListener implements ChangeListener {
 
         private final HistoryComboBox destination;
 
-        ChangesetCommentObserver(HistoryComboBox destination) {
+        ChangesetCommentChangeListener(HistoryComboBox destination) {
             this.destination = destination;
         }
 
         @Override
-        public void update(Observable o, Object arg) {
-            if (!(o instanceof ChangesetCommentModel)) return;
-            String newComment = (String) arg;
+        public void stateChanged(ChangeEvent e) {
+            if (!(e.getSource() instanceof ChangesetCommentModel)) return;
+            String newComment = ((ChangesetCommentModel) e.getSource()).getComment();
             if (!destination.getText().equals(newComment)) {
                 destination.setText(newComment);
Index: trunk/src/org/openstreetmap/josm/gui/io/ChangesetCommentModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/ChangesetCommentModel.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/io/ChangesetCommentModel.java	(revision 10210)
@@ -3,5 +3,6 @@
 
 import java.util.Objects;
-import java.util.Observable;
+
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 
 /**
@@ -10,5 +11,5 @@
  * @since 3133
  */
-public class ChangesetCommentModel extends Observable {
+public class ChangesetCommentModel extends ChangeNotifier {
     private String comment = "";
 
@@ -22,6 +23,5 @@
         this.comment = comment == null ? "" : comment;
         if (!Objects.equals(oldValue, this.comment)) {
-            setChanged();
-            notifyObservers(this.comment);
+            fireStateChanged();
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java	(revision 10210)
@@ -4,8 +4,8 @@
 import java.awt.BorderLayout;
 import java.util.Map;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.TableModelEvent;
 import javax.swing.event.TableModelListener;
@@ -41,6 +41,6 @@
         this.changesetCommentModel = changesetCommentModel;
         this.changesetSourceModel = changesetSourceModel;
-        this.changesetCommentModel.addObserver(new ChangesetCommentObserver("comment"));
-        this.changesetSourceModel.addObserver(new ChangesetCommentObserver("source"));
+        this.changesetCommentModel.addChangeListener(new ChangesetCommentChangeListener("comment"));
+        this.changesetSourceModel.addChangeListener(new ChangesetCommentChangeListener("source"));
         build();
         pnlTagEditor.getModel().addTableModelListener(this);
@@ -113,16 +113,16 @@
      * with the current changeset comment
      */
-    class ChangesetCommentObserver implements Observer {
+    class ChangesetCommentChangeListener implements ChangeListener {
 
         private final String key;
 
-        ChangesetCommentObserver(String key) {
+        ChangesetCommentChangeListener(String key) {
             this.key = key;
         }
 
         @Override
-        public void update(Observable o, Object arg) {
-            if (o instanceof ChangesetCommentModel) {
-                String newValue = (String) arg;
+        public void stateChanged(ChangeEvent e) {
+            if (e.getSource() instanceof ChangesetCommentModel) {
+                String newValue = ((ChangesetCommentModel) e.getSource()).getComment();
                 String oldValue = getTagEditorValue(key);
                 if (oldValue == null) {
@@ -130,5 +130,5 @@
                 }
                 if (!oldValue.equals(newValue)) {
-                    setProperty(key, (String) arg);
+                    setProperty(key, newValue);
                 }
             }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java	(revision 10210)
@@ -14,8 +14,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Observable;
 import java.util.Set;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 import org.openstreetmap.josm.plugins.PluginException;
 import org.openstreetmap.josm.plugins.PluginHandler;
@@ -25,5 +25,5 @@
  * The plugin model behind a {@code PluginListPanel}.
  */
-public class PluginPreferencesModel extends Observable {
+public class PluginPreferencesModel extends ChangeNotifier {
     // remember the initial list of active plugins
     private final Set<String> currentActivePlugins;
@@ -61,6 +61,5 @@
         }
         filterExpression = filter;
-        clearChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
@@ -87,6 +86,5 @@
             }
         }
-        clearChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java	(revision 10209)
+++ trunk/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java	(revision 10210)
@@ -12,9 +12,9 @@
 import java.util.HashSet;
 import java.util.Map;
-import java.util.Observable;
-import java.util.Observer;
 import java.util.Set;
 
 import javax.swing.JCheckBox;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -31,5 +31,5 @@
     private final Map<Adjustable, Boolean> enabledMap;
 
-    private final Observable observable;
+    private final ChangeNotifier observable;
 
     /**
@@ -39,5 +39,5 @@
         synchronizedAdjustables = new HashSet<>();
         enabledMap = new HashMap<>();
-        observable = new Observable();
+        observable = new ChangeNotifier();
     }
 
@@ -84,5 +84,5 @@
 
         enabledMap.put(adjustable, isParticipating);
-        observable.notifyObservers();
+        observable.fireStateChanged();
     }
 
@@ -143,8 +143,8 @@
         });
 
-        observable.addObserver(
-                new Observer() {
+        observable.addChangeListener(
+                new ChangeListener() {
                     @Override
-                    public void update(Observable o, Object arg) {
+                    public void stateChanged(ChangeEvent e) {
                         boolean sync = isParticipatingInSynchronizedScrolling(adjustable);
                         if (view.isSelected() != sync) {
Index: trunk/src/org/openstreetmap/josm/gui/util/ChangeNotifier.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/ChangeNotifier.java	(revision 10210)
+++ trunk/src/org/openstreetmap/josm/gui/util/ChangeNotifier.java	(revision 10210)
@@ -0,0 +1,57 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.EventListenerList;
+
+/**
+ * Replacement to {@code java.util.Observable} class, deprecated with Java 9.
+ * @since 10210
+ */
+public class ChangeNotifier {
+
+    /** Stores the listeners on this model. */
+    private final EventListenerList listenerList = new EventListenerList();
+
+    /**
+     * Only one {@code ChangeEvent} is needed per button model
+     * instance since the event's only state is the source property.
+     * The source of events generated is always "this".
+     */
+    private ChangeEvent changeEvent;
+
+    /**
+     * Adds a {@code ChangeListener}.
+     * @param l the listener to add
+     */
+    public final void addChangeListener(ChangeListener l) {
+        listenerList.add(ChangeListener.class, l);
+    }
+
+    /**
+     * Removes a {@code ChangeListener}.
+     * @param l the listener to add
+     */
+    public final void removeChangeListener(ChangeListener l) {
+        listenerList.remove(ChangeListener.class, l);
+    }
+
+    /**
+     * Notifies all listeners that have registered interest for notification on this event type.
+     * The event instance is created lazily.
+     */
+    protected final void fireStateChanged() {
+        // Guaranteed to return a non-null array
+        Object[] listeners = listenerList.getListenerList();
+        // Process the listeners last to first, notifying those that are interested in this event
+        for (int i = listeners.length-2; i >= 0; i -= 2) {
+            if (listeners[i] == ChangeListener.class) {
+                // Lazily create the event:
+                if (changeEvent == null)
+                    changeEvent = new ChangeEvent(this);
+                ((ChangeListener) listeners[i+1]).stateChanged(changeEvent);
+            }
+        }
+    }
+}
Index: trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java	(revision 10209)
+++ trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java	(revision 10210)
@@ -6,6 +6,6 @@
 import static org.junit.Assert.assertTrue;
 
-import java.util.Observable;
-import java.util.Observer;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.junit.Before;
@@ -24,9 +24,9 @@
 public class PropertiesMergeModelTest {
 
-    private abstract static class TestObserver implements Observer {
+    private abstract static class TestChangeListener implements ChangeListener {
         public int numInvocations;
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             numInvocations++;
             doTest();
@@ -113,7 +113,7 @@
         // decide KEEP_MINE  and ensure notification via Observable
         //
-        TestObserver observerTest;
-        model.addObserver(
-                observerTest = new TestObserver() {
+        TestChangeListener observerTest;
+        model.addChangeListener(
+                observerTest = new TestChangeListener() {
                     @Override
                     public void doTest() {
@@ -128,7 +128,7 @@
         // decide KEEP_THEIR and  ensure notification via Observable
         //
-        model.deleteObserver(observerTest);
-        model.addObserver(
-                observerTest = new TestObserver() {
+        model.removeChangeListener(observerTest);
+        model.addChangeListener(
+                observerTest = new TestChangeListener() {
                     @Override
                     public void doTest() {
@@ -140,5 +140,5 @@
         assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR));
         observerTest.assertNumInvocations(1);
-        model.deleteObserver(observerTest);
+        model.removeChangeListener(observerTest);
     }
 }
