diff --git a/lib/modules/Process.pmod b/lib/modules/Process.pmod
index 3d365538737de1746097445f7acc1beacc9a1d88..d6d90350f6f7cbcddb6b2276ebf2ca0f80e11f2a 100644
--- a/lib/modules/Process.pmod
+++ b/lib/modules/Process.pmod
@@ -236,23 +236,27 @@ mapping run(string|array(string) cmd, void|mapping modifiers)
   mystderr->set_read_callback( lambda( mixed i, string data) {
                                  gotstderr += data;
                                } );
+  mystdout->set_close_callback( lambda () {
+				  mystdout->set_read_callback(0);
+				  mystdout = 0;
+				});
+  mystderr->set_close_callback( lambda () {
+				  mystderr->set_read_callback(0);
+				  mystderr = 0;
+				});
 
   if (mystdin) {
     Shuffler.Shuffle sf = Shuffler.Shuffler()->shuffle( mystdin );
     sf->add_source(stdin_str);
+    sf->set_done_callback (lambda () {
+			     mystdin = 0;
+			   });
     sf->start();
-    mystdin = 0;
   }
 
-  while( !p->status() || p->status() == 1 )
+  while( mystdout || mystderr || mystdin )
     Pike.DefaultBackend( 1.0 );
 
-  mystdout->set_read_callback(0);
-  mystderr->set_read_callback(0);
-  
-  gotstdout += mystdout->read();
-  gotstderr += mystderr->read();
-
   exitcode = p->wait();
 #endif