Index: src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 1596)
+++ src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(working copy)
@@ -11,11 +11,14 @@
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
 import org.openstreetmap.josm.tools.DateUtils;
 
 /**
@@ -319,6 +322,43 @@
         }
         @Override public String toString() {return "untagged";}
     }
+    
+    /**
+     * Matches objects which are parents of a selected object.
+     */
+    private static class Parent extends Match {
+        @Override public boolean match(OsmPrimitive osm) {
+            boolean isParent = false;
+            if (osm instanceof Way) {
+                for (Node n : ((Way)osm).nodes)
+                    isParent |= n.selected;
+            } else if (osm instanceof Relation) {
+                for (RelationMember member : ((Relation)osm).members) {
+                    if (member.member != null)
+                        isParent |= member.member.selected;
+                }
+            }
+            return isParent;
+        }
+        @Override public String toString() {return "parent";}
+    }
+    
+    /**
+     * Matches objects which are children of a selected object.
+     */
+    private static class Child extends Match {
+        @Override public boolean match(OsmPrimitive osm) {
+            boolean isChild = false;
+            CollectBackReferencesVisitor backRefs = new CollectBackReferencesVisitor(Main.ds);
+            osm.visit(backRefs);
+            for (OsmPrimitive parent : backRefs.data) {
+                isChild |= parent.selected;
+            }
+            return isChild;
+        }
+        
+        @Override public String toString() {return "child";}
+    }
 
     public static class ParseError extends Exception {
         public ParseError(String msg) {
@@ -407,6 +447,10 @@
             return new Untagged();
         } else if (tok.equals("selected")) {
             return new Selected();
+        } else if (tok.equals("parent")) {
+            return new Parent();
+        } else if (tok.equals("child")) {
+            return new Child();
         } else {
             return new Any(tok);
         }
Index: src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 1596)
+++ src/org/openstreetmap/josm/actions/search/SearchAction.java	(working copy)
@@ -93,6 +93,8 @@
                 + "<li>"+tr("<b>selected</b> - all selected objects")+"</li>"
                 + "<li>"+tr("<b>incomplete</b> - all incomplete objects")+"</li>"
                 + "<li>"+tr("<b>untagged</b> - all untagged objects")+"</li>"
+                + "<li>"+tr("<b>child</b> - all children of selected objects")+"</li>"
+                + "<li>"+tr("<b>parent</b> - all parents of selected objects")+"</li>"
                 + "<li>"+tr("Use <b>|</b> or <b>OR</b> to combine with logical or")+"</li>"
                 + "<li>"+tr("Use <b>\"</b> to quote operators (e.g. if key contains :)")+"</li>"
                 + "<li>"+tr("Use <b>(</b> and <b>)</b> to group expressions")+"</li>"
