Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 6025)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java	(revision 6026)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.util.HighlightHelper;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -57,7 +58,7 @@
      * set would have to be checked.
      */
-    private Set<OsmPrimitive> oldHighlights = new HashSet<OsmPrimitive>();
     private WaySegment oldHighlightedWaySegment = null;
 
+    private static final HighlightHelper highlightHelper = new HighlightHelper();
     private boolean drawTargetHighlight;
 
@@ -173,8 +174,5 @@
      */
     private void removeHighlighting() {
-        for(OsmPrimitive prim : oldHighlights) {
-            prim.setHighlighted(false);
-        }
-        oldHighlights = new HashSet<OsmPrimitive>();
+        highlightHelper.clear();
         DataSet ds = getCurrentDataSet();
         if(ds != null) {
@@ -233,18 +231,5 @@
             oldHighlightedWaySegment = newHighlightedWaySegment;
         }
-
-        for(OsmPrimitive x : newHighlights) {
-            if(oldHighlights.contains(x)) {
-                continue;
-            }
-            needsRepaint = true;
-            x.setHighlighted(true);
-        }
-        oldHighlights.removeAll(newHighlights);
-        for(OsmPrimitive x : oldHighlights) {
-            x.setHighlighted(false);
-            needsRepaint = true;
-        }
-        oldHighlights = newHighlights;
+        needsRepaint |= highlightHelper.highlightOnly(newHighlights);
         if(needsRepaint) {
             Main.map.mapView.repaint();
Index: trunk/src/org/openstreetmap/josm/gui/util/HighlightHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/HighlightHelper.java	(revision 6025)
+++ trunk/src/org/openstreetmap/josm/gui/util/HighlightHelper.java	(revision 6026)
@@ -3,5 +3,7 @@
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Set;
 import org.openstreetmap.josm.Main;
@@ -20,10 +22,32 @@
      * Highlight and remember given primitives
      * @param prims - primitives to highlight/unhighlight
-     * @param flag - true to highlight
      */
-    public void highlight(Collection <? extends OsmPrimitive> prims, boolean flag) {
+    public boolean highlight(Collection <? extends OsmPrimitive> prims) {
+        return highlight(prims, false);
+    }
+    
+    /**
+     * Highlight and remember given primitives
+     * @param prims - primitives to highlight/unhighlight
+     * @param only - remove previous highlighting
+     */
+    public boolean highlight(Collection <? extends OsmPrimitive> prims, boolean only) {
+        boolean needsRepaint = false;
+        if (only) {
+            Iterator<OsmPrimitive> it = highlightedPrimitives.iterator();
+            while (it.hasNext()) {
+                OsmPrimitive p = it.next();
+                if (!prims.contains(p)) {
+                    p.setHighlighted(false);
+                    it.remove();
+                    needsRepaint = true;
+                }
+            }
+        }
         for (OsmPrimitive p: prims) {
-            highlight(p, flag);
+            needsRepaint |= setHighlight(p, true);
         }
+        //return true;
+        return needsRepaint;
     }
     
@@ -32,7 +56,6 @@
      * @param prims - primitives to highlight/unhighlight
      */
-    public void highlightOnly(Collection <? extends OsmPrimitive> prims) {
-        clear();
-        highlight(prims, true);
+    public boolean highlightOnly(Collection <? extends OsmPrimitive> prims) {
+        return highlight(prims, true);
     }
     
@@ -41,7 +64,6 @@
      * @param p - primitives to highlight/unhighlight
      */
-    public void highlightOnly(OsmPrimitive p) {
-        clear();
-        highlight(p, true);
+    public boolean highlightOnly(OsmPrimitive p) {
+        return highlight(Collections.singleton(p), true);
     }
     
@@ -51,19 +73,24 @@
      * @param flag - true to highlight
      */
-    public void highlight(OsmPrimitive p, boolean flag) {
+    public boolean setHighlight(OsmPrimitive p, boolean flag) {
         if (p instanceof Relation) {
+            boolean needRepaint = false;
             for (OsmPrimitive m: ((Relation) p).getMemberPrimitives()) {
-                highlight(m, flag);
+                needRepaint |= setHighlight(m, flag);
             }
+            return needRepaint;
         } else
         if (flag) {
             if (highlightedPrimitives.add(p)) {
                 p.setHighlighted(true);
+                return true;
             }
         } else {
             if (highlightedPrimitives.remove(p)) {
                 p.setHighlighted(false);
+                return true;
             }
         }
+        return false;
     }
     
@@ -81,5 +108,5 @@
      * Slow method to import all currently highlighted primitives into this instance
      */
-    public void findAllHighligted() {
+    public void findAllHighlighted() {
         DataSet ds = Main.main.getCurrentDataSet();
         if (ds!=null) {
@@ -89,7 +116,7 @@
     
     /**
-     * Slow method to import all currently highlighted primitives into this instance
+     * Slow method to remove highlights from all primitives
      */
-    public static void clearAllHighligted() {
+    public static void clearAllHighlighted() {
         DataSet ds = Main.main.getCurrentDataSet();
         if (ds!=null) {
