Index: /trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/Main.java	(revision 3316)
+++ /trunk/src/org/openstreetmap/josm/Main.java	(revision 3317)
@@ -477,5 +477,5 @@
         if (args.containsKey("selection")) {
             for (String s : args.get("selection")) {
-                SearchAction.search(s, SearchAction.SearchMode.add, false, false);
+                SearchAction.search(s, SearchAction.SearchMode.add);
             }
         }
Index: /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 3316)
+++ /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 3317)
@@ -158,4 +158,6 @@
 
         JCheckBox caseSensitive = new JCheckBox(tr("case sensitive"), initialValues.caseSensitive);
+        JCheckBox allElements = new JCheckBox(tr("all objects"), initialValues.allElements);
+        allElements.setToolTipText(tr("Also include incomplete and deleted objects in search."));
         JCheckBox regexSearch   = new JCheckBox(tr("regular expression"), initialValues.regexSearch);
 
@@ -168,4 +170,5 @@
         left.add(in_selection, GBC.eop());
         left.add(caseSensitive, GBC.eol());
+        left.add(allElements, GBC.eol());
         left.add(regexSearch, GBC.eol());
 
@@ -231,4 +234,5 @@
         initialValues.mode = mode;
         initialValues.caseSensitive = caseSensitive.isSelected();
+        initialValues.allElements = allElements.isSelected();
         initialValues.regexSearch = regexSearch.isSelected();
         return initialValues;
@@ -277,5 +281,10 @@
             }
 
-            for (OsmPrimitive osm : Main.main.getCurrentDataSet().allNonDeletedCompletePrimitives()) {
+            Collection<OsmPrimitive> all;
+            if(s.allElements)
+                all = Main.main.getCurrentDataSet().allPrimitives();
+            else
+                all = Main.main.getCurrentDataSet().allNonDeletedCompletePrimitives();
+            for (OsmPrimitive osm : all) {
                 if (s.mode == SearchMode.replace) {
                     if (matcher.match(osm)) {
@@ -348,6 +357,6 @@
     }
 
-    public static void search(String search, SearchMode mode, boolean caseSensitive, boolean regexSearch) {
-        search(new SearchSetting(search, mode, caseSensitive, regexSearch));
+    public static void search(String search, SearchMode mode) {
+        search(new SearchSetting(search, mode, false, false, false));
     }
 
@@ -402,12 +411,16 @@
         public boolean caseSensitive;
         public boolean regexSearch;
+        public boolean allElements;
 
         public SearchSetting() {
-            this("", SearchMode.replace, false /* case insensitive */, false /* no regexp */);
-        }
-
-        public SearchSetting(String text, SearchMode mode, boolean caseSensitive, boolean regexSearch) {
+            this("", SearchMode.replace, false /* case insensitive */,
+            false /* no regexp */, false /* only useful primitives */);
+        }
+
+        public SearchSetting(String text, SearchMode mode, boolean caseSensitive,
+        boolean regexSearch, boolean allElements) {
             this.caseSensitive = caseSensitive;
             this.regexSearch = regexSearch;
+            this.allElements = allElements;
             this.mode = mode;
             this.text = text;
@@ -415,5 +428,6 @@
 
         public SearchSetting(SearchSetting original) {
-            this(original.text, original.mode, original.caseSensitive, original.regexSearch);
+            this(original.text, original.mode, original.caseSensitive,
+            original.regexSearch, original.allElements);
         }
 
@@ -422,8 +436,10 @@
             String cs = caseSensitive ?
                     /*case sensitive*/  trc("search", "CS") :
-                        /*case insensitive*/  trc("search", "CI");
-                    /*regex search*/
-                    String rx = regexSearch ? (", " + trc("search", "RX")) : "";
-                    return "\"" + text + "\" (" + cs + rx + ", " + mode + ")";
+                    /*case insensitive*/  trc("search", "CI");
+            String rx = regexSearch ? (", " +
+                    /*regex search*/ trc("search", "RX")) : "";
+            String all = allElements ? (", " +
+                    /*all elements*/ trc("search", "A")) : "";
+            return "\"" + text + "\" (" + cs + rx + all + ", " + mode + ")";
         }
 
@@ -435,4 +451,5 @@
             return (o.caseSensitive == this.caseSensitive
                     && o.regexSearch == this.regexSearch
+                    && o.allElements == this.allElements
                     && o.mode.equals(this.mode)
                     && o.text.equals(this.text));
@@ -463,4 +480,6 @@
                 } else if (s.charAt(index) == 'R') {
                     result.regexSearch = true;
+                } else if (s.charAt(index) == 'A') {
+                    result.allElements = true;
                 } else if (s.charAt(index) == ' ') {
                     break;
@@ -493,4 +512,7 @@
                 result.append('R');
             }
+            if (allElements) {
+                result.append('A');
+            }
             result.append(' ');
             result.append(text);
Index: /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 3316)
+++ /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 3317)
@@ -583,5 +583,5 @@
     private static class Untagged extends Match {
         @Override public boolean match(OsmPrimitive osm) {
-            return !osm.isTagged();
+            return !osm.isTagged() && !osm.isIncomplete();
         }
         @Override public String toString() {return "untagged";}
Index: /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 3316)
+++ /trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 3317)
@@ -439,30 +439,66 @@
     private static boolean checkAndConfirmOutlyingDeletes(OsmDataLayer layer, Collection<OsmPrimitive> primitivesToDelete) {
         Area a = layer.data.getDataSourceArea();
+        boolean outside = false;
+        boolean incomplete = false;
         if (a != null) {
             for (OsmPrimitive osm : primitivesToDelete) {
-                if (osm instanceof Node && !osm.isNew()) {
-                    Node n = (Node) osm;
-                    if (!a.contains(n.getCoor())) {
-                        JPanel msg = new JPanel(new GridBagLayout());
-                        msg.add(new JLabel(
-                                "<html>" +
-                                // leave message in one tr() as there is a grammatical
-                                // connection.
-                                tr("You are about to delete nodes outside of the area you have downloaded."
-                                        + "<br>"
-                                        + "This can cause problems because other objects (that you do not see) might use them."
-                                        + "<br>" + "Do you really want to delete?") + "</html>"));
-                        return ConditionalOptionPaneUtil.showConfirmationDialog(
-                                "delete_outside_nodes",
-                                Main.parent,
-                                msg,
-                                tr("Delete confirmation"),
-                                JOptionPane.YES_NO_OPTION,
-                                JOptionPane.QUESTION_MESSAGE,
-                                JOptionPane.YES_OPTION
-                        );
-                    }
-                }
-            }
+                if (osm.isIncomplete())
+                    incomplete = true;
+                else if (osm instanceof Node && !osm.isNew()
+                && !a.contains(((Node) osm).getCoor()))
+                    outside = true;
+            }
+        }
+        else
+        {
+            for (OsmPrimitive osm : primitivesToDelete)
+                if (osm.isIncomplete())
+                    incomplete = true;
+        }
+        if(outside)
+        {
+            JPanel msg = new JPanel(new GridBagLayout());
+            msg.add(new JLabel(
+                    "<html>" +
+                    // leave message in one tr() as there is a grammatical
+                    // connection.
+                    tr("You are about to delete nodes outside of the area you have downloaded."
+                            + "<br>"
+                            + "This can cause problems because other objects (that you do not see) might use them."
+                            + "<br>" + "Do you really want to delete?") + "</html>"));
+            boolean answer = ConditionalOptionPaneUtil.showConfirmationDialog(
+                    "delete_outside_nodes",
+                    Main.parent,
+                    msg,
+                    tr("Delete confirmation"),
+                    JOptionPane.YES_NO_OPTION,
+                    JOptionPane.QUESTION_MESSAGE,
+                    JOptionPane.YES_OPTION
+            );
+            if(!answer)
+                return false;
+        }
+        if(incomplete)
+        {
+            JPanel msg = new JPanel(new GridBagLayout());
+            msg.add(new JLabel(
+                    "<html>" +
+                    // leave message in one tr() as there is a grammatical
+                    // connection.
+                    tr("You are about to delete incomplete objects."
+                            + "<br>"
+                            + "This will cause problems because you don't see the real object."
+                            + "<br>" + "Do you really want to delete?") + "</html>"));
+            boolean answer = ConditionalOptionPaneUtil.showConfirmationDialog(
+                    "delete_incomplete",
+                    Main.parent,
+                    msg,
+                    tr("Delete confirmation"),
+                    JOptionPane.YES_NO_OPTION,
+                    JOptionPane.QUESTION_MESSAGE,
+                    JOptionPane.YES_OPTION
+            );
+            if(!answer)
+                return false;
         }
         return true;
Index: /trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(revision 3316)
+++ /trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(revision 3317)
@@ -77,4 +77,6 @@
         new PrefixSuffixSwitcher("forwards", "backwards"),
         new PrefixSuffixSwitcher("up", "down"),
+        new PrefixSuffixSwitcher("east", "west"),
+        new PrefixSuffixSwitcher("north", "south"),
     };
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/Filter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Filter.java	(revision 3316)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Filter.java	(revision 3317)
@@ -15,12 +15,13 @@
     public Boolean inverted = false;
     public Filter() {
-        super("", SearchMode.add, false, false);
+        super("", SearchMode.add, false, false, false);
     }
-    public Filter(String text, SearchMode mode, boolean caseSensitive, boolean regexSearch) {
-        super(text, mode, caseSensitive, regexSearch);
+    public Filter(String text, SearchMode mode, boolean caseSensitive,
+    boolean regexSearch, boolean allElements) {
+        super(text, mode, caseSensitive, regexSearch, allElements);
     }
 
     public Filter(String prefText){
-        super("", SearchMode.add, false, false);
+        super("", SearchMode.add, false, false, false);
         String[] prfs = prefText.split(";");
         if(prfs.length != 10 && !prfs[0].equals(version))
