Index: src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 2141)
+++ src/org/openstreetmap/josm/actions/search/SearchAction.java	(working copy)
@@ -140,11 +140,11 @@
         SearchMode mode = replace.isSelected() ? SearchAction.SearchMode.replace
                 : (add.isSelected() ? SearchAction.SearchMode.add
                 : (remove.isSelected() ? SearchAction.SearchMode.remove : SearchAction.SearchMode.in_selection));
-        if(initialValues instanceof Filter){
-           return new Filter(input.getText(), mode, caseSensitive.isSelected(), regexSearch.isSelected());
-        } else {
-           return new SearchSetting(input.getText(), mode, caseSensitive.isSelected(), regexSearch.isSelected());
-        }
+        initialValues.text = input.getText();
+        initialValues.mode = mode;
+        initialValues.caseSensitive = caseSensitive.isSelected();
+        initialValues.regexSearch = regexSearch.isSelected();
+        return initialValues;
     }
 
     /**
@@ -178,10 +178,10 @@
         try {
             String searchText = s.text;
             if(s instanceof Filter){
-               searchText = ((Filter)s).inverted ? "-" : "";
-               searchText = searchText + "(" + ((Filter)s).text + ")" + (((Filter)s).applyForChildren ? ("| child (" + ((Filter)s).text + ")"): "");
+               searchText = "(" + s.text + ")" + (((Filter)s).applyForChildren ? ("| child (" + s.text + ")"): "");
+               searchText = (((Filter)s).inverted ? "-" : "") + "(" +  searchText + ")";
             }
-            /*System.out.println(searchText);  */
+            System.out.println(searchText);
             SearchCompiler.Match matcher = SearchCompiler.compile(searchText, s.caseSensitive, s.regexSearch);
             foundMatches = 0;
             for (OsmPrimitive osm : Main.main.getCurrentDataSet().allNonDeletedCompletePrimitives()) {
Index: src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 2141)
+++ src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(working copy)
@@ -5,14 +5,19 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.I18n.trn;
 
+import javax.swing.JCheckBox;
 import javax.swing.JPanel;
 import javax.swing.JTable;
 import javax.swing.table.JTableHeader;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.event.TableModelListener;
+import javax.swing.event.TableModelEvent;
+import javax.swing.table.TableCellRenderer;
 import javax.swing.ListSelectionModel;
 import javax.swing.JPopupMenu;
-import javax.swing.table.AbstractTableModel;
 import javax.swing.JScrollPane;
 
+import java.awt.Component;
 import java.awt.FlowLayout;
 import java.awt.BorderLayout;
 import java.awt.GridLayout;
@@ -37,7 +42,7 @@
  *
  * @author Petr_Dlouhý
  */
-public class FilterDialog extends ToggleDialog implements DataChangeListener, LayerChangeListener {
+public class FilterDialog extends ToggleDialog implements DataChangeListener, LayerChangeListener, TableModelListener {
     private JTable userTable;
     private Filters filters = new Filters();
     private SideButton addButton;
@@ -120,11 +125,11 @@
     }
 
     protected String[] columnToolTips = {
-        tr("Filter elements"),
-        tr("Disable elements"),
+        tr("Enable filter"),
+        tr("Hide elements"),
+        null,
         tr("Apply also for children"),
         tr("Inverse filter"),
-        null,
         tr("Filter mode")
     };
 
@@ -144,7 +149,9 @@
                };
            }
         };   
-  
+
+        filters.addTableModelListener(this);
+
         userTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
         userTable.getColumnModel().getColumn(0).setMaxWidth(1);
@@ -159,6 +166,11 @@
         userTable.getColumnModel().getColumn(4).setResizable(false);
         userTable.getColumnModel().getColumn(5).setResizable(false);
 
+        userTable.setDefaultRenderer(Boolean.class, new BooleanRenderer());
+        userTable.setDefaultRenderer(String.class, new StringRenderer());
+
+        tableChanged(null);
+
         pnl.add(new JScrollPane(userTable), BorderLayout.CENTER);
 
         // -- the button row
@@ -186,4 +198,27 @@
    public void dataChanged(OsmDataLayer l){
       filters.filter();
    }
+
+   class StringRenderer extends DefaultTableCellRenderer {
+      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
+         Filters model = (Filters)table.getModel();
+         Component cell = (Component)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+         cell.setEnabled(model.isCellEnabled(row, column));
+         return cell;
+      }
+   }
+
+   class BooleanRenderer extends JCheckBox implements TableCellRenderer {
+      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
+         Filters model = (Filters)table.getModel();
+         setSelected((Boolean)value);
+         setEnabled(model.isCellEnabled(row, column));
+         setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+         return this;
+      }
+   }
+
+   public void tableChanged(TableModelEvent e){
+      setTitle("Filter Hidden:" + filters.hiddenCount + " Disabled:" + filters.disabledCount);
+   }
 }
Index: src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 2141)
+++ 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.isFiltered() && r.isUsable()) {
+                if (!r.isFiltered() && !r.incomplete && !r.isDeleted()) {
                     for (RelationMember m : r.getMembers()) {
                         if (newSelection.contains(m.getMember())) {
                             Collection<RelationMember> value = roles.get(r);
Index: src/org/openstreetmap/josm/data/osm/Filters.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Filters.java	(revision 2141)
+++ src/org/openstreetmap/josm/data/osm/Filters.java	(working copy)
@@ -20,6 +20,8 @@
  */
 public class Filters extends AbstractTableModel{
 
+   public int disabledCount, hiddenCount;
+
    public Filters(){
       loadPrefs();
    }
@@ -28,24 +30,27 @@
    public void filter(){
       Collection<OsmPrimitive> seld = new LinkedList<OsmPrimitive> ();
       Collection<OsmPrimitive> self = new LinkedList<OsmPrimitive> ();
+      if(Main.main.getCurrentDataSet() == null)return;
       Main.main.getCurrentDataSet().setFiltered();
       Main.main.getCurrentDataSet().setDisabled();
       for (Filter flt : filters){
-            if(flt.filtered){
-               SearchAction.getSelection(flt, self, new Function(){
-                  public Boolean isSomething(OsmPrimitive o){
-                     return o.isFiltered();
-                  }
-               });
-            } 
-            if(flt.disabled) {
+            if(flt.enable){
                SearchAction.getSelection(flt, seld, new Function(){
                   public Boolean isSomething(OsmPrimitive o){
                      return o.isDisabled();
                   }
                });
+               if(flt.hide) {
+                  SearchAction.getSelection(flt, self, new Function(){
+                     public Boolean isSomething(OsmPrimitive o){
+                        return o.isFiltered();
+                     }
+                  });
+               }
             }
       }
+      disabledCount = seld.size() - self.size();
+      hiddenCount = self.size();
       Main.main.getCurrentDataSet().setFiltered(self);
       Main.main.getCurrentDataSet().setDisabled(seld);
       Main.map.mapView.repaint();
@@ -133,7 +138,7 @@
    }
 
    public String getColumnName(int column){
-      String[] names = { tr("F"), tr("D"), tr("Text"), tr("C"), tr("I"), tr("M") };
+      String[] names = { tr("E"), tr("H"), tr("Text"), tr("C"), tr("I"), tr("M") };
       return names[column];
    }
 
@@ -142,7 +147,13 @@
       return classes[column];
    }
 
+   public boolean isCellEnabled(int row, int column){
+      if(!filters.get(row).enable && column!=0) return false;
+      return true;
+   }
+
    public boolean isCellEditable(int row, int column){
+      if(!filters.get(row).enable && column!=0) return false;
       if(column < 5)return true;
       return false;
    }
@@ -150,33 +161,35 @@
    public void setValueAt(Object aValue, int row, int column){
       Filter f = filters.get(row);
       switch(column){
-         case 0: f.filtered = (Boolean)aValue;
+         case 0: f.enable = (Boolean)aValue;
                  savePref(row);
                  filter();
-                 return;
-         case 1: f.disabled = (Boolean)aValue;
+                 fireTableRowsUpdated(row, row);
+                 break;
+         case 1: f.hide = (Boolean)aValue;
                  savePref(row);
                  filter();
-                 return;
+                 break;
          case 2: f.text = (String)aValue;
                  savePref(row);
-                 return;
+                 break;
          case 3: f.applyForChildren = (Boolean)aValue;
                  savePref(row);
                  filter();
-                 return;
+                 break;
          case 4: f.inverted = (Boolean)aValue;
                  savePref(row);
                  filter();
-                 return;
+                 break;
       }
+      if(column!=0)fireTableCellUpdated(row, column);
    }
 
    public Object getValueAt(int row, int column){
       Filter f = filters.get(row);
       switch(column){
-         case 0: return f.filtered;
-         case 1: return f.disabled;
+         case 0: return f.enable;
+         case 1: return f.hide;
          case 2: return f.text;
          case 3: return f.applyForChildren;
          case 4: return f.inverted;
Index: src/org/openstreetmap/josm/data/osm/Filter.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Filter.java	(revision 2141)
+++ src/org/openstreetmap/josm/data/osm/Filter.java	(working copy)
@@ -10,8 +10,8 @@
  */
 public class Filter extends SearchSetting {
    private final String version = "1";
-   public Boolean filtered = false;
-   public Boolean disabled = true;
+   public Boolean enable = true;
+   public Boolean hide = false;
    public Boolean inverted = false;
    public Boolean applyForChildren = true;
    public Filter() {
@@ -33,8 +33,8 @@
       if(prfs[2].equals("in_selection")) mode = SearchMode.in_selection;
       caseSensitive = Boolean.parseBoolean(prfs[3]);
       regexSearch = Boolean.parseBoolean(prfs[4]);
-      filtered = Boolean.parseBoolean(prfs[6]);
-      disabled = Boolean.parseBoolean(prfs[7]);
+      enable = Boolean.parseBoolean(prfs[6]);
+      hide = Boolean.parseBoolean(prfs[7]);
       inverted = Boolean.parseBoolean(prfs[8]);
       applyForChildren = Boolean.parseBoolean(prfs[9]);
 
@@ -43,7 +43,7 @@
    public String getPrefString(){
       return version + ";" + 
           text + ";" + mode + ";" + caseSensitive + ";" + regexSearch + ";" +
-          "legacy" + ";" + filtered + ";" + disabled + ";" + 
+          "legacy" + ";" + enable + ";" + hide + ";" + 
           inverted + ";" + applyForChildren;
    }
 }
