Index: src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 2116)
+++ src/org/openstreetmap/josm/actions/SplitWayAction.java	(working copy)
@@ -101,7 +101,7 @@
             HashMap<Way, Integer> wayOccurenceCounter = new HashMap<Way, Integer>();
             for (Node n : selectedNodes) {
                 for (Way w : getCurrentDataSet().ways) {
-                    if (w.isDeleted() || w.incomplete) {
+                    if (!w.isUsable()) {
                         continue;
                     }
                     int last = w.getNodesCount()-1;
@@ -292,7 +292,7 @@
         // now copy all relations to new way also
 
         for (Relation r : getCurrentDataSet().relations) {
-            if (r.isDeleted() || r.incomplete) {
+            if (!r.isUsable()) {
                 continue;
             }
             Relation c = null;
Index: src/org/openstreetmap/josm/actions/UnGlueAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 2116)
+++ src/org/openstreetmap/josm/actions/UnGlueAction.java	(working copy)
@@ -65,7 +65,7 @@
         if (checkSelection(selection)) {
             int count = 0;
             for (Way w : getCurrentDataSet().ways) {
-                if (w.isDeleted() || w.incomplete || w.getNodesCount() < 1) {
+                if (!w.isUsable() || w.getNodesCount() < 1) {
                     continue;
                 }
                 if (!w.containsNode(selectedNode)) {
Index: src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 2116)
+++ src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(working copy)
@@ -766,7 +766,7 @@
     public Way getWayForNode(Node n) {
         Way way = null;
         for (Way w : getCurrentDataSet().ways) {
-            if (w.isDeleted() || w.incomplete || w.getNodesCount() < 1) {
+            if (!w.isUsable() || w.getNodesCount() < 1) {
                 continue;
             }
             Node firstNode = w.getNode(0);
Index: src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 2116)
+++ src/org/openstreetmap/josm/actions/CombineWayAction.java	(working copy)
@@ -285,7 +285,7 @@
          */
         public void build(DataSet ds) {
             for (Relation r: ds.relations) {
-                if (r.isDeleted() || r.incomplete) {
+                if (!r.isUsable()) {
                     continue;
                 }
                 Set<Way> referringWays = OsmPrimitive.getFilteredSet(r.getMemberPrimitives(), Way.class);
Index: src/org/openstreetmap/josm/gui/SelectionManager.java
===================================================================
--- src/org/openstreetmap/josm/gui/SelectionManager.java	(revision 2116)
+++ src/org/openstreetmap/josm/gui/SelectionManager.java	(working copy)
@@ -285,14 +285,14 @@
         } else {
             // 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);
                 }
             }
 
             // ways
             for (Way w : nc.getCurrentDataSet().ways) {
-                if (w.isDeleted() || w.getNodesCount() == 0 || w.incomplete) {
+                if (!w.isUsable() || w.getNodesCount() == 0){
                     continue;
                 }
                 if (alt) {
Index: src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 2116)
+++ src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(working copy)
@@ -317,7 +317,7 @@
 
     @Override public void visitBoundingBox(final BoundingXYVisitor v) {
         for (final Node n : data.nodes)
-            if (!n.isDeleted() && !n.incomplete) {
+            if (n.isUsable()) {
                 v.visit(n);
             }
     }
@@ -440,7 +440,7 @@
         gpxData.storageFile = file;
         HashSet<Node> doneNodes = new HashSet<Node>();
         for (Way w : data.ways) {
-            if (w.incomplete || w.isDeleted()) {
+            if (!w.isUsable()) {
                 continue;
             }
             GpxTrack trk = new GpxTrack();
@@ -452,7 +452,7 @@
 
             ArrayList<WayPoint> trkseg = null;
             for (Node n : w.getNodes()) {
-                if (n.incomplete || n.isDeleted()) {
+                if (!n.isUsable()) {
                     trkseg = null;
                     continue;
                 }
Index: src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 2116)
+++ src/org/openstreetmap/josm/gui/NavigatableComponent.java	(working copy)
@@ -306,7 +306,7 @@
         if(ds == null)
             return null;
         for (Node n : ds.nodes) {
-            if (n.isDeleted() || n.incomplete) {
+            if (!n.isUsable()) {
                 continue;
             }
             Point sp = getPoint(n);
@@ -337,7 +337,7 @@
         if(ds == null)
             return null;
         for (Way w : ds.ways) {
-            if (w.isDeleted() || w.incomplete) {
+            if (!w.isUsable()) {
                 continue;
             }
             Node lastN = null;
@@ -461,12 +461,12 @@
         if(ds == null)
             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;
                 }
                 if (lastN == null) {
@@ -487,7 +487,7 @@
             }
         }
         for (Node n : ds.nodes) {
-            if (!n.isDeleted() && !n.incomplete
+            if (n.isUsable()
                     && getPoint(n).distanceSq(p) < snapDistance) {
                 nearest.add(n);
             }
@@ -509,7 +509,7 @@
         if(ds == null)
             return null;
         for (Node n : ds.nodes) {
-            if (!n.isDeleted() && !n.incomplete
+            if (n.isUsable()
                     && getPoint(n).distanceSq(p) < snapDistance) {
                 nearest.add(n);
             }
Index: src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2116)
+++ src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(working copy)
@@ -134,7 +134,7 @@
         if (getNumRelations() > 0 ) {
             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: src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 2116)
+++ src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(working copy)
@@ -749,7 +749,7 @@
         Map<Relation, Collection<RelationMember>> roles = new HashMap<Relation, Collection<RelationMember>>();
         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())) {
                             Collection<RelationMember> value = roles.get(r);
Index: src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 2116)
+++ src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(working copy)
@@ -148,7 +148,7 @@
            require changing the colour while painting... */
         //profilerN = 0;
         for (final OsmPrimitive osm : data.relations)
-            if (!osm.isDeleted() && !osm.isSelected())
+            if (!osm.isDeleted() && !osm.isSelected() && !osm.isFiltered())
             {
                 osm.visit(this);
                 //        profilerN++;
@@ -162,7 +162,7 @@
 
         //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);
                 //        profilerN++;
@@ -170,7 +170,7 @@
         displaySegments();
 
         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);
                 //        profilerN++;
@@ -201,7 +201,7 @@
 
         //profilerN = 0;
         for (final OsmPrimitive osm : data.nodes)
-            if (!osm.isDeleted() && !osm.isSelected())
+            if (!osm.isDeleted() && !osm.isSelected() && !osm.isFiltered())
             {
                 osm.visit(this);
                 //        profilerN++;
@@ -219,7 +219,7 @@
             //    profilerN = 0;
             currentColor = nodeColor;
             for (final OsmPrimitive osm : data.ways)
-                if (!osm.isDeleted())
+                if (!osm.isDeleted() && !osm.isDisabled() && !osm.isFiltered())
                 {
                     visitVirtual((Way)osm);
                     //                profilerN++;
@@ -248,7 +248,7 @@
     public void visit(Node n) {
         if (n.incomplete) return;
 
-        if (inactive) {
+        if (inactive || n.isDisabled()) {
             drawNode(n, inactiveColor, unselectedNodeSize, unselectedNodeRadius, fillUnselectedNode);
         } else if (n.highlighted) {
             drawNode(n, highlightColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode);
@@ -311,7 +311,7 @@
         boolean showOnlyHeadArrowOnly = showThisDirectionArrow && !w.isSelected() && showHeadArrowOnly;
         Color wayColor;
 
-        if (inactive) {
+        if (inactive || w.isDisabled()) {
             wayColor = inactiveColor;
         } else if(w.highlighted) {
             wayColor = highlightColor;
@@ -344,7 +344,7 @@
         if (r.incomplete) return;
 
         Color col;
-        if (inactive) {
+        if (inactive || r.isDisabled()) {
             col = inactiveColor;
         } else if (r.isSelected()) {
             col = selectedColor;
Index: src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 2116)
+++ src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(working copy)
@@ -158,6 +158,8 @@
             drawNode(n, selectedColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode);
         } 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);
         }
@@ -306,6 +308,8 @@
             color = highlightColor;
         } else if(w.isSelected()) {
             color = selectedColor;
+        } else if(w.isDisabled()) {
+            color = inactiveColor;
         }
 
         /* draw overlays under the way */
@@ -529,7 +533,7 @@
         {
             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);
                 }
@@ -1394,7 +1398,7 @@
             //    profilerN = 0;
             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);
                     //            profilerN++;
@@ -1411,7 +1415,7 @@
             //    profilerN = 0;
             for (final Way osm : data.ways)
             {
-                if (!osm.incomplete && !osm.isDeleted()
+                if (!osm.incomplete && !osm.isDeleted() && !osm.isFiltered()
                         && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid)
                 {
                     if(isPrimitiveArea(osm) && osm.mappaintDrawnAreaCode != paintid)
@@ -1452,7 +1456,7 @@
             /*** WAYS (filling disabled)  ***/
             //    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 )
                 {
                     osm.visit(this);
@@ -1491,7 +1495,7 @@
         /*** NODES ***/
         //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)
             {
                 osm.visit(this);
@@ -1511,7 +1515,7 @@
             //    profilerN = 0;
             currentColor = nodeColor;
             for (final OsmPrimitive osm : data.ways)
-                if (!osm.incomplete && !osm.isDeleted()
+                if (osm.isUsable() && !osm.isFiltered()
                         && osm.mappaintVisibleCode != viewid )
                 {
                     /* TODO: move this into the SimplePaint code? */
Index: src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2116)
+++ src/org/openstreetmap/josm/data/osm/DataSet.java	(working copy)
@@ -183,6 +183,52 @@
         return getSelected(relations);
     }
 
+    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);
         clearSelection(ways);
@@ -209,6 +255,29 @@
     }
 
     /**
+     * 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);
+        }
+    }
+
+    /**
      * Remove the selection from every value in the collection.
      * @param list The collection to remove the selection from.
      */
Index: src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2116)
+++ src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(working copy)
@@ -123,6 +123,18 @@
     private boolean visible = true;
 
     /**
+     * <code>true</code>, if the object has been set inactive
+     * 
+     */
+    public boolean disabled = false;
+
+    /**
+     * <code>true</code>, if the object has been filtered out
+     * 
+     */
+    public boolean filtered = false;
+
+    /**
      * User that last modified this primitive, as specified by the server.
      * Never changed by JOSM.
      */
@@ -172,8 +184,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
@@ -229,7 +274,7 @@
      * @see #delete(boolean)
      */
     public boolean isUsable() {
-        return !deleted && !incomplete;
+        return !deleted && !incomplete && !disabled;
     }
 
     /**

