diff --git a/lib/modules/Search.pmod/Filter.pmod/Base.pike b/lib/modules/Search.pmod/Filter.pmod/Base.pike
index 70da1cdb2d7dc46ee790120ec1d6870325e4b564..fb255b379c3ae63ab5d0adba036d53b342b12391 100644
--- a/lib/modules/Search.pmod/Filter.pmod/Base.pike
+++ b/lib/modules/Search.pmod/Filter.pmod/Base.pike
@@ -8,7 +8,9 @@ constant contenttypes = ({ });
 .Output filter(Standards.URI uri, string|Stdio.File data,
 	      string content_type, mixed ... more);
 
-string my_popen(array(string) args, string|void cwd, int|void wait_for_exit)
+
+string my_popen(array(string) args, string|void cwd, int|void wait_for_exit,
+		array(string)|void watchdog_args)
   // A smarter version of Process.popen: No need to quote arguments.
 {    
   Stdio.File pipe0 = Stdio.File();
@@ -20,11 +22,25 @@ string my_popen(array(string) args, string|void cwd, int|void wait_for_exit)
     setup["cwd"] = cwd;
   Process.create_process proc = Process.create_process(args, setup);
   pipe1->close();
+
+  //  Launch watchdog if provided (requires wait_for_exit)
+  Process.Process watchdog;
+  if (wait_for_exit && watchdog_args) {
+    //  Insert pid of running process where caller used "%p"
+    array(string) wd_args =
+      replace(watchdog_args + ({ }), "%p", (string) proc->pid());
+    watchdog = Process.spawn_pike(wd_args);
+  }
+  
   string result = pipe0->read();
   if(!result)
     error("my_popen failed with error "+pipe0->errno()+".\n");
   pipe0->close();
   if (wait_for_exit)
     proc->wait();
+  
+  if (watchdog)
+    watchdog->kill(9);
+  
   return result;
 }