Index: /trunk/src/org/openstreetmap/josm/data/osm/NoteData.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/NoteData.java	(revision 12342)
+++ /trunk/src/org/openstreetmap/josm/data/osm/NoteData.java	(revision 12343)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.data.notes.NoteComment;
 import org.openstreetmap.josm.gui.JosmUserIdentityManager;
+import org.openstreetmap.josm.tools.ListenerList;
 
 /**
@@ -22,4 +23,23 @@
 public class NoteData {
 
+    /**
+     * A listener that can be informed on note data changes.
+     * @author Michael Zangl
+     * @since 12343
+     */
+    public interface NoteDataUpdateListener {
+        /**
+         * Called when the note data is updated
+         * @param data The data that was changed
+         */
+        void noteDataUpdated(NoteData data);
+
+        /**
+         * The selected node was changed
+         * @param noteData The data of which the selected node was changed
+         */
+        void selectedNoteChanged(NoteData noteData);
+    }
+
     private long newNoteId = -1;
 
@@ -27,4 +47,6 @@
     private Note selectedNote;
     private Comparator<Note> comparator = Note.DEFAULT_COMPARATOR;
+
+    private final ListenerList<NoteDataUpdateListener> listeners = ListenerList.create();
 
     /**
@@ -77,6 +99,6 @@
         if (Main.map != null) {
             Main.map.noteDialog.selectionChanged();
-            Main.map.mapView.repaint();
-        }
+        }
+        listeners.fireEvent(l -> l.selectedNoteChanged(this));
     }
 
@@ -213,6 +235,6 @@
         if (Main.isDisplayingMapView()) {
             Main.map.noteDialog.setNotes(getSortedNotes());
-            Main.map.mapView.repaint();
-        }
+        }
+        listeners.fireEvent(l -> l.noteDataUpdated(this));
     }
 
@@ -256,3 +278,19 @@
         dataUpdated();
     }
+
+    /**
+     * Adds a listener that listens to node data changes
+     * @param listener The listener
+     */
+    public void addNoteDataUpdateListener(NoteDataUpdateListener listener) {
+        listeners.addListener(listener);
+    }
+
+    /**
+     * Removes a listener that listens to node data changes
+     * @param listener The listener
+     */
+    public void removeNoteDataUpdateListener(NoteDataUpdateListener listener) {
+        listeners.removeListener(listener);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java	(revision 12342)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java	(revision 12343)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.data.notes.NoteComment;
 import org.openstreetmap.josm.data.osm.NoteData;
+import org.openstreetmap.josm.data.osm.NoteData.NoteDataUpdateListener;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MapView;
@@ -49,5 +50,5 @@
  * @since 7522
  */
-public class NoteLayer extends AbstractModifiableLayer implements MouseListener {
+public class NoteLayer extends AbstractModifiableLayer implements MouseListener, NoteDataUpdateListener {
 
     private final NoteData noteData;
@@ -61,4 +62,5 @@
         super(name);
         noteData = new NoteData(notes);
+        noteData.addNoteDataUpdateListener(this);
     }
 
@@ -71,4 +73,11 @@
     public void hookUpMapView() {
         Main.map.mapView.addMouseListener(this);
+    }
+
+    @Override
+    public synchronized void destroy() {
+        Main.map.mapView.removeMouseListener(this);
+        noteData.removeNoteDataUpdateListener(this);
+        super.destroy();
     }
 
@@ -260,5 +269,4 @@
         }
         noteData.setSelectedNote(closestNote);
-        invalidate();
     }
 
@@ -292,3 +300,13 @@
         // Do nothing
     }
+
+    @Override
+    public void noteDataUpdated(NoteData data) {
+        invalidate();
+    }
+
+    @Override
+    public void selectedNoteChanged(NoteData noteData) {
+        invalidate();
+    }
 }
