Index: trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 2263)
+++ trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 2264)
@@ -152,5 +152,5 @@
         Node c = new Node(selectedNode);
         c.removeAll();
-        c.setSelected(false);
+        getCurrentDataSet().clearSelection(c);
         cmds.add(new ChangeCommand(selectedNode, c));
 
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 2263)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 2264)
@@ -325,5 +325,6 @@
         mousePos = e.getPoint();
 
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        DataSet ds = getCurrentDataSet();
+        Collection<OsmPrimitive> selection = ds.getSelected();
         Collection<Command> cmds = new LinkedList<Command>();
 
@@ -405,5 +406,5 @@
                     // here so /only/ the new way will be selected after this method finishes.
                     if(alt) {
-                        wnew.setSelected(false);
+                        ds.addSelected(wnew);
                     }
 
@@ -519,5 +520,5 @@
                 extendedWay = true;
                 getCurrentDataSet().setSelected(way);
-                DataSet.fireSelectionChanged(getCurrentDataSet().getSelected());
+                DataSet.fireSelectionChanged(ds.getSelected());
             }
         }
@@ -532,5 +533,5 @@
                 title = tr("Add node into way");
                 for (Way w : reuseWays) {
-                    w.setSelected(false);
+                    ds.clearSelection(w);
                 }
             }
Index: trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 2263)
+++ trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 2264)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.data.osm.Filter;
+import org.openstreetmap.josm.data.osm.DataSet;
 
 public class SearchAction extends JosmAction{
@@ -89,4 +90,5 @@
         left.add(input, GBC.eop().fill(GBC.HORIZONTAL));
         left.add(replace, GBC.eol());
+        DataSet ds = Main.main.getCurrentDataSet();
         left.add(add, GBC.eol());
         left.add(remove, GBC.eol());
@@ -237,11 +239,12 @@
         //        }
 
-        Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getSelected();
+        final DataSet ds = Main.main.getCurrentDataSet();
+        Collection<OsmPrimitive> sel = ds.getSelected();
         int foundMatches = getSelection(s, sel, new Function(){
             public Boolean isSomething(OsmPrimitive o){
-                return o.isSelected();
+                return ds.isSelected(o);
             }
         });
-        Main.main.getCurrentDataSet().setSelected(sel);
+        ds.setSelected(sel);
         if (foundMatches == 0) {
             String msg = null;
Index: trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 2263)
+++ trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 2264)
@@ -424,5 +424,5 @@
     private static class Selected extends Match {
         @Override public boolean match(OsmPrimitive osm) {
-            return osm.isSelected();
+            return Main.main.getCurrentDataSet().isSelected(osm);
         }
         @Override public String toString() {return "selected";}
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2263)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2264)
@@ -217,4 +217,17 @@
     }
 
+    public boolean addSelected(OsmPrimitive osm) {
+        osm.setSelected(true);
+        return true;
+    }
+
+    public boolean toggleSelected(OsmPrimitive osm) {
+        osm.setSelected(!osm.isSelected());
+        return true;
+    }
+    public boolean isSelected(OsmPrimitive osm) {
+        return osm.isSelected();
+    }
+
     public void setDisabled(OsmPrimitive... osm) {
         if (osm.length == 1 && osm[0] == null) {
@@ -283,4 +296,7 @@
      * @param list The collection to remove the selection from.
      */
+    public void clearSelection(OsmPrimitive... osm) {
+        clearSelection(Arrays.asList(osm));
+    }
     private void clearSelection(Collection<? extends OsmPrimitive> list) {
         if (list == null)
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2263)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2264)
@@ -221,5 +221,5 @@
      * @since 1899
      */
-    public void setSelected(boolean selected) {
+    @Deprecated public void setSelected(boolean selected) {
         if (selected) {
             flags |= FLAG_SELECTED;
@@ -234,5 +234,5 @@
      * @since 1899
      */
-    public boolean isSelected() {
+    @Deprecated public boolean isSelected() {
         return (flags & FLAG_SELECTED) != 0;
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 2263)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 2264)
@@ -152,8 +152,8 @@
 
         if (nodeStyle != null && isZoomOk(nodeStyle) && showIcons > dist) {
-            drawNode(n, nodeStyle.icon, nodeStyle.annotate, n.isSelected());
+            drawNode(n, nodeStyle.icon, nodeStyle.annotate, data.isSelected(n));
         } else if (n.highlighted) {
             drawNode(n, highlightColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode);
-        } else if (n.isSelected()) {
+        } else if (data.isSelected(n)) {
             drawNode(n, selectedColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode);
         } else if (n.isTagged()) {
@@ -227,5 +227,5 @@
             //profilerVisibleWays++;
             //if(!profilerOmitDraw)
-            drawWay(w, null, untaggedColor, w.isSelected());
+            drawWay(w, null, untaggedColor, data.isSelected(w));
         }
         else if(wayStyle instanceof LineElemStyle)
@@ -234,5 +234,5 @@
             //profilerVisibleWays++;
             //if(!profilerOmitDraw)
-            drawWay(w, (LineElemStyle)wayStyle, untaggedColor, w.isSelected());
+            drawWay(w, (LineElemStyle)wayStyle, untaggedColor, data.isSelected(w));
         }
         else if (wayStyle instanceof AreaElemStyle)
@@ -245,10 +245,10 @@
             {
                 //    profilerVisibleAreas++;
-                drawArea(w, w.isSelected() ? selectedColor : areaStyle.color);
+                drawArea(w, data.isSelected(w) ? selectedColor : areaStyle.color);
                 if(!w.isClosed()) {
                     w.putError(tr("Area style way is not closed."), true);
                 }
             }
-            drawWay(w, areaStyle.line, areaStyle.color, w.isSelected());
+            drawWay(w, areaStyle.line, areaStyle.color, data.isSelected(w));
             //}
         }
@@ -259,9 +259,9 @@
            the way is tagged with a direction key
            (even if the tag is negated as in oneway=false) or the way is selected */
-        boolean showDirection = w.isSelected() || ((!useRealWidth) && (showDirectionArrow
+        boolean showDirection = data.isSelected(w) || ((!useRealWidth) && (showDirectionArrow
                 && (!showRelevantDirectionsOnly || w.hasDirectionKeys())));
         /* head only takes over control if the option is true,
            the direction should be shown at all and not only because it's selected */
-        boolean showOnlyHeadArrowOnly = showDirection && !w.isSelected() && showHeadArrowOnly;
+        boolean showOnlyHeadArrowOnly = showDirection && !data.isSelected(w) && showHeadArrowOnly;
         int width = defaultSegmentWidth;
         int realWidth = 0; /* the real width of the element in meters */
@@ -307,5 +307,5 @@
         if(w.highlighted) {
             color = highlightColor;
-        } else if(w.isSelected()) {
+        } else if(data.isSelected(w)) {
             color = selectedColor;
         } else if(w.isDisabled()) {
@@ -325,5 +325,5 @@
                         if(lastN != null)
                         {
-                            drawSeg(lastN, n, s.color != null  && !w.isSelected() ? s.color : color,
+                            drawSeg(lastN, n, s.color != null  && !data.isSelected(w) ? s.color : color,
                                     false, s.getWidth(width), s.dashed, s.dashedColor);
                         }
@@ -359,5 +359,5 @@
                         if(lastN != null)
                         {
-                            drawSeg(lastN, n, s.color != null && !w.isSelected() ? s.color : color,
+                            drawSeg(lastN, n, s.color != null && !data.isSelected(w) ? s.color : color,
                                     false, s.getWidth(width), s.dashed, s.dashedColor);
                         }
@@ -405,5 +405,5 @@
                         Way c = (Way)joinArray[i];
                         if(w == null)
-                        { w = c; selected = w.isSelected(); joinArray[i] = null; --left; }
+                        { w = c; selected = data.isSelected(w); joinArray[i] = null; --left; }
                         else
                         {
@@ -441,5 +441,5 @@
                                 joinArray[i] = null;
                                 joined = true;
-                                if(c.isSelected()) {
+                                if(data.isSelected(c)) {
                                     selected = true;
                                 }
@@ -474,5 +474,8 @@
                 w = new Way(w);
                 w.setNodes(n);
-                w.setSelected(selected);
+                if (selected)
+                    data.setSelected(w);
+                else
+                    data.clearSelection(w);
             }
             if(!w.isClosed())
@@ -551,5 +554,5 @@
         }
 
-        if(r.isSelected()) /* draw ways*/
+        if(data.isSelected(r)) /* draw ways*/
         {
             for (RelationMember m : r.getMembers())
@@ -828,5 +831,5 @@
         smallIcon.paintIcon ( Main.map.mapView, g, (int)(pVia.x+vx+vx2)-w/2, (int)(pVia.y+vy+vy2)-h/2 );
 
-        if (r.isSelected())
+        if (data.isSelected(r))
         {
             g.setColor (  selectedColor );
@@ -872,5 +875,5 @@
                         if(!m.hasRole()) {
                             outer.add(w);
-                        } else if(r.isSelected()) {
+                        } else if(data.isSelected(r)) {
                             drawSelectedMember(m.getMember(), styles != null
                                     ? getPrimitiveStyle(m.getMember()) : null, true, true);
@@ -1052,5 +1055,5 @@
                     if(isPolygonVisible(p))
                     {
-                        drawAreaPolygon(p, (pd.way.isSelected() || r.isSelected()) ? selectedColor
+                        drawAreaPolygon(p, (data.isSelected(pd.way) || data.isSelected(r)) ? selectedColor
                                 : areaStyle.color);
                         visible = true;
@@ -1078,6 +1081,6 @@
                     {
                         drawWay(wInner, ((AreaElemStyle)wayStyle).line,
-                                ((AreaElemStyle)wayStyle).color, wInner.isSelected()
-                                || r.isSelected());
+                                ((AreaElemStyle)wayStyle).color, data.isSelected(wInner)
+                                || data.isSelected(r));
                     }
                     wInner.mappaintDrawnCode = paintid;
@@ -1085,8 +1088,8 @@
                 else
                 {
-                    if(r.isSelected())
+                    if(data.isSelected(r))
                     {
                         drawSelectedMember(wInner, innerStyle,
-                                !wayStyle.equals(innerStyle), wInner.isSelected());
+                                !wayStyle.equals(innerStyle), data.isSelected(wInner));
                     }
                     if(wayStyle.equals(innerStyle))
@@ -1094,5 +1097,5 @@
                         r.putError(tr("Style for inner way ''{0}'' equals multipolygon.",
                                 wInner.getDisplayName(DefaultNameFormatter.getInstance())), false);
-                        if(!r.isSelected()) {
+                        if(!data.isSelected(r)) {
                             wInner.mappaintDrawnAreaCode = paintid;
                         }
@@ -1108,6 +1111,6 @@
                     {
                         drawWay(wOuter, ((AreaElemStyle)wayStyle).line,
-                                ((AreaElemStyle)wayStyle).color, wOuter.isSelected()
-                                || r.isSelected());
+                                ((AreaElemStyle)wayStyle).color, data.isSelected(wOuter)
+                                || data.isSelected(r));
                     }
                     wOuter.mappaintDrawnCode = paintid;
@@ -1121,5 +1124,5 @@
                                 wOuter.getDisplayName(DefaultNameFormatter.getInstance())), true);
                     }
-                    if(r.isSelected())
+                    if(data.isSelected(r))
                     {
                         drawSelectedMember(wOuter, outerStyle, false, false);
@@ -1326,8 +1329,10 @@
     }
 
+    DataSet data;
+
     /* Shows areas before non-areas */
     @Override
     public void visitAll(DataSet data, Boolean virtual) {
-
+        this.data = data;
         //boolean profiler = Main.pref.getBoolean("mappaint.profiler",false);
         //profilerOmitDraw = Main.pref.getBoolean("mappaint.profiler.omitdraw",false);
@@ -1450,5 +1455,5 @@
             //    profilerN = 0;
             for (final OsmPrimitive osm : data.ways)
-                if (!osm.incomplete && !osm.isDeleted() && !osm.isFiltered() && !osm.isSelected()
+                if (!osm.incomplete && !osm.isDeleted() && !osm.isFiltered() && !data.isSelected(osm)
                         && osm.mappaintVisibleCode != viewid )
                 {
@@ -1489,5 +1494,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm : data.nodes)
-            if (!osm.incomplete && !osm.isDeleted() && (osm.isSelected() || !osm.isFiltered())
+            if (!osm.incomplete && !osm.isDeleted() && (data.isSelected(osm) || !osm.isFiltered())
                     && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid)
             {
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 2263)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 2264)
@@ -128,5 +128,7 @@
     }
 
+    DataSet ds;
     public void visitAll(DataSet data, Boolean virtual) {
+        this.ds = data;
         //boolean profiler = Main.pref.getBoolean("simplepaint.profiler",false);
         //long profilerStart = java.lang.System.currentTimeMillis();
@@ -149,5 +151,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm : data.relations)
-            if (!osm.isDeleted() && !osm.isSelected() && !osm.isFiltered())
+            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isFiltered())
             {
                 osm.visit(this);
@@ -163,5 +165,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm : data.ways)
-            if (!osm.isDeleted() && !osm.isSelected() && !osm.isFiltered() && osm.isTagged())
+            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isFiltered() && osm.isTagged())
             {
                 osm.visit(this);
@@ -171,5 +173,5 @@
 
         for (final OsmPrimitive osm : data.ways)
-            if (!osm.isDeleted() && !osm.isSelected() && !osm.isFiltered() && !osm.isTagged())
+            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isFiltered() && !osm.isTagged())
             {
                 osm.visit(this);
@@ -202,5 +204,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm : data.nodes)
-            if (!osm.isDeleted() && !osm.isSelected() && !osm.isFiltered())
+            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isFiltered())
             {
                 osm.visit(this);
@@ -253,5 +255,5 @@
         } else if (n.highlighted) {
             drawNode(n, highlightColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode);
-        } else if (n.isSelected()) {
+        } else if (ds.isSelected(n)) {
             drawNode(n, selectedColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode);
         } else if(n.isTagged()) {
@@ -305,9 +307,9 @@
            (even if the tag is negated as in oneway=false) or the way is selected */
 
-        boolean showThisDirectionArrow = w.isSelected()
+        boolean showThisDirectionArrow = ds.isSelected(w)
         || (showDirectionArrow && (!showRelevantDirectionsOnly || w.hasDirectionKeys()));
         /* head only takes over control if the option is true,
            the direction should be shown at all and not only because it's selected */
-        boolean showOnlyHeadArrowOnly = showThisDirectionArrow && !w.isSelected() && showHeadArrowOnly;
+        boolean showOnlyHeadArrowOnly = showThisDirectionArrow && !ds.isSelected(w) && showHeadArrowOnly;
         Color wayColor;
 
@@ -316,5 +318,5 @@
         } else if(w.highlighted) {
             wayColor = highlightColor;
-        } else if(w.isSelected()) {
+        } else if(ds.isSelected(w)) {
             wayColor = selectedColor;
         } else if (!w.isTagged()) {
@@ -347,5 +349,5 @@
         if (inactive || r.isDisabled()) {
             col = inactiveColor;
-        } else if (r.isSelected()) {
+        } else if (ds.isSelected(r)) {
             col = selectedColor;
         } else {
Index: trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 2263)
+++ trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 2264)
@@ -300,4 +300,5 @@
          */
         private final void popupCycleSelection(Collection<OsmPrimitive> osms, int mods) {
+            DataSet ds = Main.main.getCurrentDataSet();
             // Find some items that are required for cycling through
             OsmPrimitive firstItem = null;
@@ -311,5 +312,5 @@
                     nextSelected = osm;
                 }
-                if(firstSelected == null && osm.isSelected()) {
+                if(firstSelected == null && ds.isSelected(osm)) {
                     firstSelected = osm;
                 }
@@ -319,20 +320,17 @@
             // pressed. Cannot use "setSelected()" because it will cause a
             // fireSelectionChanged event which is unnecessary at this point.
-            if((mods & MouseEvent.SHIFT_DOWN_MASK) == 0) {
-                for(OsmPrimitive o : Main.main.getCurrentDataSet().getSelected()) {
-                    o.setSelected(false);
-                }
-            }
+            if((mods & MouseEvent.SHIFT_DOWN_MASK) == 0)
+                ds.clearSelection();
 
             // This will cycle through the available items.
             if(firstSelected == null) {
-                firstItem.setSelected(true);
+                ds.addSelected(firstItem);
             } else {
-                firstSelected.setSelected(false);
+                ds.clearSelection(firstSelected);
                 if(nextSelected != null) {
-                    nextSelected.setSelected(true);
-                }
-            }
-            DataSet.fireSelectionChanged(Main.main.getCurrentDataSet().getSelected());
+                    ds.addSelected(nextSelected);
+                }
+            }
+            DataSet.fireSelectionChanged(ds.getSelected());
         }
 
@@ -398,5 +396,6 @@
          */
         private final void popupSetLabelColors(JLabel lbl, OsmPrimitive osm) {
-            if(osm.isSelected()) {
+            DataSet ds = Main.main.getCurrentDataSet();
+            if(ds.isSelected(osm)) {
                 lbl.setBackground(SystemColor.textHighlight);
                 lbl.setForeground(SystemColor.textHighlightText);
@@ -460,7 +459,8 @@
                 }
                 @Override public void mouseClicked(MouseEvent e) {
+                    DataSet ds = Main.main.getCurrentDataSet();
                     // Let the user toggle the selection
-                    osm.setSelected(!osm.isSelected());
-                    DataSet.fireSelectionChanged(Main.main.getCurrentDataSet().getSelected());
+                    ds.toggleSelected(osm);
+                    DataSet.fireSelectionChanged(ds.getSelected());
                     l.validate();
                 }
Index: trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 2263)
+++ trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 2264)
@@ -318,6 +318,6 @@
             // when multiple nodes on one point, prefer new or selected nodes
             else if(dist == minDistanceSq && minPrimitive != null
-                    && ((n.getId() == 0 && n.isSelected())
-                            || (!minPrimitive.isSelected() && (n.isSelected() || n.getId() == 0)))) {
+                    && ((n.getId() == 0 && ds.isSelected(n))
+                            || (!ds.isSelected(minPrimitive) && (ds.isSelected(n) || n.getId() == 0)))) {
                 minPrimitive = n;
             }
@@ -360,5 +360,5 @@
                 double perDist = a-(a-b+c)*(a-b+c)/4/c; // perpendicular distance squared
                 if (perDist < snapDistance && a < c+snapDistance && b < c+snapDistance) {
-                    if(w.isSelected()) {
+                    if(ds.isSelected(w)) {
                         perDist -= 0.00001;
                     }
