diff --git a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
index e623b70..5167817 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
@@ -1298,6 +1298,16 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
     }
 
     @Override
+    public Collection<? extends OsmPrimitive> getPreservedPrimitives() {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
+            return null;
+        } else {
+            return ds.getSelected();
+        }
+    }
+
+    @Override
     public boolean layerIsSupported(Layer l) {
         return l instanceof OsmDataLayer;
     }
diff --git a/src/org/openstreetmap/josm/actions/mapmode/MapMode.java b/src/org/openstreetmap/josm/actions/mapmode/MapMode.java
index f6d774f..7e3caf0 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/MapMode.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/MapMode.java
@@ -7,15 +7,18 @@ import java.awt.event.InputEvent;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
+import java.util.Collection;
+import java.util.Collections;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
+import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
-import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
-import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 
 /**
  * A class implementing MapMode is able to be selected as an mode for map editing.
@@ -171,4 +174,12 @@ public abstract class MapMode extends JosmAction implements MouseListener, Mouse
     public void preferenceChanged(PreferenceChangeEvent e) {
         readPreferences();
     }
+
+    /**
+     * Gets a collection of primitives that should not be hidden by the filter.
+     * @return The primitives that the filter should not hide.
+     */
+    public Collection<? extends OsmPrimitive> getPreservedPrimitives() {
+        return Collections.emptySet();
+    }
 }
diff --git a/src/org/openstreetmap/josm/data/osm/FilterMatcher.java b/src/org/openstreetmap/josm/data/osm/FilterMatcher.java
index ae5a979..e3f206c 100644
--- a/src/org/openstreetmap/josm/data/osm/FilterMatcher.java
+++ b/src/org/openstreetmap/josm/data/osm/FilterMatcher.java
@@ -5,6 +5,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.search.SearchAction.SearchMode;
 import org.openstreetmap.josm.actions.search.SearchCompiler;
 import org.openstreetmap.josm.actions.search.SearchCompiler.Match;
@@ -225,7 +226,7 @@ public class FilterMatcher {
 
     private static FilterType test(List<FilterInfo> filters, OsmPrimitive primitive, boolean hidden) {
 
-        if (primitive.isIncomplete())
+        if (primitive.isIncomplete() || Main.map.mapMode.getPreservedPrimitives().contains(primitive))
             return FilterType.NOT_FILTERED;
 
         boolean filtered = false;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java b/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
index 721e1db..0f4fcb3 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
@@ -26,6 +26,7 @@ import javax.swing.table.JTableHeader;
 import javax.swing.table.TableCellRenderer;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.data.osm.Filter;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -43,6 +44,8 @@ import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
 import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
+import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.MapFrame.MapModeChangeListener;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
@@ -54,7 +57,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  *
  * @author Petr_Dlouhý
  */
-public class FilterDialog extends ToggleDialog implements DataSetListener {
+public class FilterDialog extends ToggleDialog implements DataSetListener, MapModeChangeListener {
 
     private JTable userTable;
     private final FilterTableModel filterModel = new FilterTableModel();
@@ -79,12 +82,14 @@ public class FilterDialog extends ToggleDialog implements DataSetListener {
     @Override
     public void showNotify() {
         DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT_CONSOLIDATED);
+        MapFrame.addMapModeChangeListener(this);
         filterModel.executeFilters();
     }
 
     @Override
     public void hideNotify() {
         DatasetEventManager.getInstance().removeDatasetListener(this);
+        MapFrame.removeMapModeChangeListener(this);
         filterModel.clearFilterFlags();
         Main.map.mapView.repaint();
     }
@@ -361,6 +366,11 @@ public class FilterDialog extends ToggleDialog implements DataSetListener {
         filterModel.executeFilters(getAffectedPrimitives(event.getPrimitives()));
     }
 
+    @Override
+    public void mapModeChange(MapMode oldMapMode, MapMode newMapMode) {
+        filterModel.executeFilters();
+    }
+
     /**
      * This method is intendet for Plugins getting the filtermodel and using .addFilter() to
      * add a new filter.
