Index: trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 2120)
@@ -286,5 +286,5 @@
         public void build(DataSet ds) {
             for (Relation r: ds.relations) {
-                if (r.isDeleted() || r.incomplete) {
+                if (!r.isUsable()) {
                     continue;
                 }
Index: trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 2120)
@@ -102,5 +102,5 @@
             for (Node n : selectedNodes) {
                 for (Way w : getCurrentDataSet().ways) {
-                    if (w.isDeleted() || w.incomplete) {
+                    if (!w.isUsable()) {
                         continue;
                     }
@@ -293,5 +293,5 @@
 
         for (Relation r : getCurrentDataSet().relations) {
-            if (r.isDeleted() || r.incomplete) {
+            if (!r.isUsable()) {
                 continue;
             }
Index: trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 2120)
@@ -66,5 +66,5 @@
             int count = 0;
             for (Way w : getCurrentDataSet().ways) {
-                if (w.isDeleted() || w.incomplete || w.getNodesCount() < 1) {
+                if (!w.isUsable() || w.getNodesCount() < 1) {
                     continue;
                 }
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 2120)
@@ -767,5 +767,5 @@
         Way way = null;
         for (Way w : getCurrentDataSet().ways) {
-            if (w.isDeleted() || w.incomplete || w.getNodesCount() < 1) {
+            if (!w.isUsable() || w.getNodesCount() < 1) {
                 continue;
             }
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2120)
@@ -184,4 +184,50 @@
     }
 
+    public void setFiltered(Collection<? extends OsmPrimitive> selection) {
+        clearFiltered(nodes);
+        clearFiltered(ways);
+        clearFiltered(relations);
+        for (OsmPrimitive osm : selection) {
+            osm.setFiltered(true);
+        }
+    }
+
+    public void setFiltered(OsmPrimitive... osm) {
+        if (osm.length == 1 && osm[0] == null) {
+            setFiltered();
+            return;
+        }
+        clearFiltered(nodes);
+        clearFiltered(ways);
+        clearFiltered(relations);
+        for (OsmPrimitive o : osm)
+            if (o != null) {
+                o.setFiltered(true);
+            }
+    }
+
+    public void setDisabled(Collection<? extends OsmPrimitive> selection) {
+        clearDisabled(nodes);
+        clearDisabled(ways);
+        clearDisabled(relations);
+        for (OsmPrimitive osm : selection) {
+            osm.setDisabled(true);
+        }
+    }
+
+    public void setDisabled(OsmPrimitive... osm) {
+        if (osm.length == 1 && osm[0] == null) {
+            setDisabled();
+            return;
+        }
+        clearDisabled(nodes);
+        clearDisabled(ways);
+        clearDisabled(relations);
+        for (OsmPrimitive o : osm)
+            if (o != null) {
+                o.setDisabled(true);
+            }
+    }
+
     public void setSelected(Collection<? extends OsmPrimitive> selection) {
         clearSelection(nodes);
@@ -207,4 +253,27 @@
             }
         fireSelectionChanged(Arrays.asList(osm));
+    }
+
+    /**
+     * Remove the filtered parameter from every value in the collection.
+     * @param list The collection to remove the filtered parameter from.
+     */
+    private void clearFiltered(Collection<? extends OsmPrimitive> list) {
+        if (list == null)
+            return;
+        for (OsmPrimitive osm : list) {
+            osm.setFiltered(false);
+        }
+    }
+    /**
+     * Remove the disabled parameter from every value in the collection.
+     * @param list The collection to remove the disabled parameter from.
+     */
+    private void clearDisabled(Collection<? extends OsmPrimitive> list) {
+        if (list == null)
+            return;
+        for (OsmPrimitive osm : list) {
+            osm.setDisabled(false);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2120)
@@ -96,5 +96,5 @@
      * new to the server! To create a new object, call the default constructor of
      * the respective class.
-     * 
+     *
      */
     private long id = 0;
@@ -105,5 +105,5 @@
      * Deleted objects are deleted from the server. If the objects are added (id=0),
      * the modified is ignored and the object is added to the server.
-     * 
+     *
      */
     private boolean modified = false;
@@ -111,5 +111,5 @@
     /**
      * <code>true</code>, if the object has been deleted.
-     * 
+     *
      */
     private boolean deleted = false;
@@ -119,7 +119,19 @@
      * introduced with the 0.4 API to be able to communicate deleted objects
      * (they will have visible=false).
-     * 
+     *
      */
     private boolean visible = true;
+
+    /**
+     * <code>true</code>, if the object has been set inactive
+     *
+     */
+    private boolean disabled = false;
+
+    /**
+     * <code>true</code>, if the object has been filtered out
+     *
+     */
+    private boolean filtered = false;
 
     /**
@@ -131,5 +143,5 @@
     /**
      * If set to true, this object is currently selected.
-     * 
+     *
      */
     private volatile boolean selected = false;
@@ -149,5 +161,5 @@
     /**
      * Creates a new primitive with id 0.
-     * 
+     *
      */
     public OsmPrimitive() {
@@ -158,5 +170,5 @@
      * Creates a new primitive for the given id. If the id > 0, the primitive is marked
      * as incomplete.
-     * 
+     *
      * @param id the id. > 0 required
      * @throws IllegalArgumentException thrown if id < 0
@@ -173,8 +185,41 @@
     /* accessors                                                                            */
     /* ------------------------------------------------------------------------------------ */
+    /**
+     * Sets whether this primitive is disabled or not.
+     *
+     * @param selected  true, if this primitive is disabled; false, otherwise
+     */
+    public void setDisabled(boolean disabled) {
+        this.disabled = disabled;
+    }
+
+    /**
+     * Replies true, if this primitive is disabled.
+     *
+     * @return true, if this primitive is disabled
+     */
+    public boolean isDisabled() {
+        return disabled;
+    }
+    /**
+     * Sets whether this primitive is filtered out or not.
+     *
+     * @param selected  true, if this primitive is filtered out; false, otherwise
+     */
+    public void setFiltered(boolean filtered) {
+        this.filtered = filtered;
+    }
+    /**
+     * Replies true, if this primitive is filtered out.
+     *
+     * @return true, if this primitive is filtered out
+     */
+    public boolean isFiltered() {
+        return filtered;
+    }
 
     /**
      * Sets whether this primitive is selected or not.
-     * 
+     *
      * @param selected  true, if this primitive is selected; false, otherwise
      * @since 1899
@@ -185,5 +230,5 @@
     /**
      * Replies true, if this primitive is selected.
-     * 
+     *
      * @return true, if this primitive is selected
      * @since 1899
@@ -195,5 +240,5 @@
     /**
      * Marks this primitive as being modified.
-     * 
+     *
      * @param modified true, if this primitive is to be modified
      */
@@ -205,5 +250,5 @@
      * Replies <code>true</code> if the object has been modified since it was loaded from
      * the server. In this case, on next upload, this object will be updated.
-     * 
+     *
      * @return <code>true</code> if the object has been modified since it was loaded from
      * the server
@@ -230,5 +275,5 @@
      */
     public boolean isUsable() {
-        return !deleted && !incomplete;
+        return !deleted && !incomplete && !disabled;
     }
 
@@ -238,5 +283,5 @@
      * Replies false, if this primitive is known on the server and has been deleted
      * on the server.
-     * 
+     *
      * @see #setVisible(boolean)
      */
@@ -248,5 +293,5 @@
      * Sets whether this primitive is visible, i.e. whether it is known on the server
      * and not deleted on the server.
-     * 
+     *
      * @see #isVisible()
      * @throws IllegalStateException thrown if visible is set to false on an primitive with
@@ -262,5 +307,5 @@
      * Replies the version number as returned by the API. The version is 0 if the id is 0 or
      * if this primitive is incomplete.
-     * 
+     *
      * @see #setVersion(int)
      */
@@ -271,5 +316,5 @@
     /**
      * Replies the id of this primitive.
-     * 
+     *
      * @return the id of this primitive.
      */
@@ -280,8 +325,8 @@
     /**
      * Sets the id and the version of this primitive if it is known to the OSM API.
-     * 
+     *
      * Since we know the id and its version it can't be incomplete anymore. incomplete
      * is set to false.
-     * 
+     *
      * @param id the id. > 0 required
      * @param version the version > 0 required
@@ -302,18 +347,18 @@
      * Clears the id and version known to the OSM API. The id and the version is set to 0.
      * incomplete is set to false.
-     * 
+     *
      * <strong>Caution</strong>: Do not use this method on primitives which are already added to a {@see DataSet}.
      * Ways and relations might already refer to the primitive and clearing the OSM ID
      * result in corrupt data.
-     * 
+     *
      * Here's an example use case:
      * <pre>
      *     // create a clone of an already existing node
      *     Node copy = new Node(otherExistingNode);
-     * 
+     *
      *     // reset the clones OSM id
      *     copy.clearOsmId();
      * </pre>
-     * 
+     *
      */
     public void clearOsmId() {
@@ -388,7 +433,7 @@
     /**
      * Sets whether this primitive is deleted or not.
-     * 
+     *
      * Also marks this primitive as modified if deleted is true and sets selected to false.
-     * 
+     *
      * @param deleted  true, if this primitive is deleted; false, otherwise
      */
@@ -442,5 +487,5 @@
     /**
      * Replies the map of key/value pairs. Never replies null. The map can be empty, though.
-     * 
+     *
      * @return Keys of this primitive. Changes made in returned map are not mapped
      * back to the primitive, use setKeys() to modify the keys
@@ -459,5 +504,5 @@
      * Sets the keys of this primitives to the key/value pairs in <code>keys</code>.
      * If <code>keys</code> is null removes all existing key/value pairs.
-     * 
+     *
      * @param keys the key/value pairs to set. If null, removes all existing key/value pairs.
      * @since 1924
@@ -474,8 +519,8 @@
      * Set the given value to the given key. If key is null, does nothing. If value is null,
      * removes the key and behaves like {@see #remove(String)}.
-     * 
+     *
      * @param key  The key, for which the value is to be set. Can be null, does nothing in this case.
      * @param value The value for the key. If null, removes the respective key/value pair.
-     * 
+     *
      * @see #remove(String)
      */
@@ -495,5 +540,5 @@
     /**
      * Remove the given key from the list
-     * 
+     *
      * @param key  the key to be removed. Ignored, if key is null.
      */
@@ -510,5 +555,5 @@
     /**
      * Removes all keys from this primitive.
-     * 
+     *
      * @since 1843
      */
@@ -521,5 +566,5 @@
      * Replies the value for key <code>key</code>. Replies null, if <code>key</code> is null.
      * Replies null, if there is no value for the given key.
-     * 
+     *
      * @param key the key. Can be null, replies null in this case.
      * @return the value for key <code>key</code>.
@@ -544,8 +589,8 @@
     /**
      * Replies true, if the map of key/value pairs of this primitive is not empty.
-     * 
+     *
      * @return true, if the map of key/value pairs of this primitive is not empty; false
      *   otherwise
-     * 
+     *
      * @since 1843
      */
@@ -656,5 +701,5 @@
      * Replies the name of this primitive. The default implementation replies the value
      * of the tag <tt>name</tt> or null, if this tag is not present.
-     * 
+     *
      * @return the name of this primitive
      */
@@ -673,7 +718,7 @@
      *   <li>name of the current locale</li>
      * </ul>
-     * 
+     *
      * null, if no such tag exists
-     * 
+     *
      * @return the name of this primitive
      */
@@ -693,5 +738,5 @@
     /**
      * Replies the display name of a primitive formatted by <code>formatter</code>
-     * 
+     *
      * @return the display name
      */
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 2120)
@@ -159,4 +159,6 @@
         } else if (n.isTagged()) {
             drawNode(n, nodeColor, taggedNodeSize, taggedNodeRadius, fillUnselectedNode);
+        } else if (n.isDisabled()) {
+            drawNode(n, inactiveColor, unselectedNodeSize, unselectedNodeRadius, fillUnselectedNode);
         } else {
             drawNode(n, nodeColor, unselectedNodeSize, unselectedNodeRadius, fillUnselectedNode);
@@ -307,4 +309,6 @@
         } else if(w.isSelected()) {
             color = selectedColor;
+        } else if(w.isDisabled()) {
+            color = inactiveColor;
         }
 
@@ -530,5 +534,5 @@
             for (RelationMember m : r.getMembers())
             {
-                if (m.isNode() && !m.getMember().incomplete && !m.getMember().isDeleted())
+                if (m.isNode() && !m.getMember().incomplete && !m.getMember().isDeleted() && !m.getMember().isFiltered())
                 {
                     drawSelectedMember(m.getMember(), styles != null ? getPrimitiveStyle(m.getMember()) : null, true, true);
@@ -1395,5 +1399,5 @@
             for (final Relation osm : data.relations)
             {
-                if(!osm.isDeleted() && !osm.incomplete && osm.mappaintVisibleCode != viewid)
+                if(!osm.isDeleted() && !osm.isFiltered() && !osm.incomplete && osm.mappaintVisibleCode != viewid)
                 {
                     osm.visit(this);
@@ -1412,5 +1416,5 @@
             for (final Way osm : data.ways)
             {
-                if (!osm.incomplete && !osm.isDeleted()
+                if (!osm.incomplete && !osm.isDeleted() && !osm.isFiltered()
                         && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid)
                 {
@@ -1453,5 +1457,5 @@
             //    profilerN = 0;
             for (final OsmPrimitive osm : data.ways)
-                if (!osm.incomplete && !osm.isDeleted() && !osm.isSelected()
+                if (!osm.incomplete && !osm.isDeleted() && !osm.isFiltered() && !osm.isSelected()
                         && osm.mappaintVisibleCode != viewid )
                 {
@@ -1492,5 +1496,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm : data.nodes)
-            if (!osm.incomplete && !osm.isDeleted()
+            if (!osm.incomplete && !osm.isDeleted() && (osm.isSelected() || !osm.isFiltered())
                     && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid)
             {
@@ -1512,5 +1516,5 @@
             currentColor = nodeColor;
             for (final OsmPrimitive osm : data.ways)
-                if (!osm.incomplete && !osm.isDeleted()
+                if (osm.isUsable() && !osm.isFiltered()
                         && osm.mappaintVisibleCode != viewid )
                 {
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 2120)
@@ -149,5 +149,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm : data.relations)
-            if (!osm.isDeleted() && !osm.isSelected())
+            if (!osm.isDeleted() && !osm.isSelected() && !osm.isFiltered())
             {
                 osm.visit(this);
@@ -163,5 +163,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm : data.ways)
-            if (!osm.isDeleted() && !osm.isSelected() && osm.isTagged())
+            if (!osm.isDeleted() && !osm.isSelected() && !osm.isFiltered() && osm.isTagged())
             {
                 osm.visit(this);
@@ -171,5 +171,5 @@
 
         for (final OsmPrimitive osm : data.ways)
-            if (!osm.isDeleted() && !osm.isSelected() && !osm.isTagged())
+            if (!osm.isDeleted() && !osm.isSelected() && !osm.isFiltered() && !osm.isTagged())
             {
                 osm.visit(this);
@@ -202,5 +202,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm : data.nodes)
-            if (!osm.isDeleted() && !osm.isSelected())
+            if (!osm.isDeleted() && !osm.isSelected() && !osm.isFiltered())
             {
                 osm.visit(this);
@@ -220,5 +220,5 @@
             currentColor = nodeColor;
             for (final OsmPrimitive osm : data.ways)
-                if (!osm.isDeleted())
+                if (!osm.isDeleted() && !osm.isDisabled() && !osm.isFiltered())
                 {
                     visitVirtual((Way)osm);
@@ -249,5 +249,5 @@
         if (n.incomplete) return;
 
-        if (inactive) {
+        if (inactive || n.isDisabled()) {
             drawNode(n, inactiveColor, unselectedNodeSize, unselectedNodeRadius, fillUnselectedNode);
         } else if (n.highlighted) {
@@ -312,5 +312,5 @@
         Color wayColor;
 
-        if (inactive) {
+        if (inactive || w.isDisabled()) {
             wayColor = inactiveColor;
         } else if(w.highlighted) {
@@ -345,5 +345,5 @@
 
         Color col;
-        if (inactive) {
+        if (inactive || r.isDisabled()) {
             col = inactiveColor;
         } else if (r.isSelected()) {
Index: trunk/src/org/openstreetmap/josm/gui/GettingStarted.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 2120)
@@ -64,6 +64,4 @@
                 motd = "<html>" + styles + "<body><h1>" + "JOSM - " + tr("Java OpenStreetMap Editor")
                 + "</h1>\n<h2 align=\"center\">(" + tr("Message of the day not available") + ")</h2></html>";
-            } else {
-                motd = motd.replace("<!-- VERSION -->", tr("- running version is {0}", AboutAction.getVersionString()));
             }
             // Save this to prefs in case JOSM is updated so MOTD can be refreshed
Index: trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 2120)
@@ -307,5 +307,5 @@
             return null;
         for (Node n : ds.nodes) {
-            if (n.isDeleted() || n.incomplete) {
+            if (!n.isUsable()) {
                 continue;
             }
@@ -338,5 +338,5 @@
             return null;
         for (Way w : ds.ways) {
-            if (w.isDeleted() || w.incomplete) {
+            if (!w.isUsable()) {
                 continue;
             }
@@ -462,10 +462,10 @@
             return null;
         for (Way w : ds.ways) {
-            if (w.isDeleted() || w.incomplete) {
+            if (!w.isUsable()) {
                 continue;
             }
             Node lastN = null;
             for (Node n : w.getNodes()) {
-                if (n.isDeleted() || n.incomplete) {
+                if (!n.isUsable()) {
                     continue;
                 }
@@ -488,5 +488,5 @@
         }
         for (Node n : ds.nodes) {
-            if (!n.isDeleted() && !n.incomplete
+            if (n.isUsable()
                     && getPoint(n).distanceSq(p) < snapDistance) {
                 nearest.add(n);
@@ -510,5 +510,5 @@
             return null;
         for (Node n : ds.nodes) {
-            if (!n.isDeleted() && !n.incomplete
+            if (n.isUsable()
                     && getPoint(n).distanceSq(p) < snapDistance) {
                 nearest.add(n);
Index: trunk/src/org/openstreetmap/josm/gui/SelectionManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/SelectionManager.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/gui/SelectionManager.java	(revision 2120)
@@ -286,5 +286,5 @@
             // nodes
             for (Node n : nc.getCurrentDataSet().nodes) {
-                if (!n.isDeleted() && !n.incomplete && r.contains(nc.getPoint(n))) {
+                if (n.isUsable() && r.contains(nc.getPoint(n))) {
                     selection.add(n);
                 }
@@ -293,5 +293,5 @@
             // ways
             for (Way w : nc.getCurrentDataSet().ways) {
-                if (w.isDeleted() || w.getNodesCount() == 0 || w.incomplete) {
+                if (!w.isUsable() || w.getNodesCount() == 0){
                     continue;
                 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 2120)
@@ -750,5 +750,5 @@
         if (Main.main.getCurrentDataSet() != null) {
             for (Relation r : Main.main.getCurrentDataSet().relations) {
-                if (!r.isDeleted() && !r.incomplete) {
+                if (!r.isFiltered() && r.isUsable()) {
                     for (RelationMember m : r.getMembers()) {
                         if (newSelection.contains(m.getMember())) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2120)
@@ -135,5 +135,5 @@
             int i = 0;
             for (OsmPrimitive e : DataSet.sort(Main.main.getCurrentDataSet().relations)) {
-                if (!e.isDeleted() && !e.incomplete) {
+                if (e.isUsable()){
                     list.setElementAt(e, i++);
                 }
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 2115)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 2120)
@@ -318,5 +318,5 @@
     @Override public void visitBoundingBox(final BoundingXYVisitor v) {
         for (final Node n : data.nodes)
-            if (!n.isDeleted() && !n.incomplete) {
+            if (n.isUsable()) {
                 v.visit(n);
             }
@@ -441,5 +441,5 @@
         HashSet<Node> doneNodes = new HashSet<Node>();
         for (Way w : data.ways) {
-            if (w.incomplete || w.isDeleted()) {
+            if (!w.isUsable()) {
                 continue;
             }
@@ -453,5 +453,5 @@
             ArrayList<WayPoint> trkseg = null;
             for (Node n : w.getNodes()) {
-                if (n.incomplete || n.isDeleted()) {
+                if (!n.isUsable()) {
                     trkseg = null;
                     continue;
