diff --git a/src/modules/spider/spider.c b/src/modules/spider/spider.c
index 2973db22b2254e934bc9fc1309ea0022999442d2..23666eb62ea7473d0249b2012c1f0525eb963a20 100644
--- a/src/modules/spider/spider.c
+++ b/src/modules/spider/spider.c
@@ -26,6 +26,7 @@
 #include <unistd.h>
 #endif
 
+#include "fdlib.h"
 #include "stralloc.h"
 #include "global.h"
 #include "pike_macros.h"
@@ -42,7 +43,7 @@
 #include "threads.h"
 #include "operators.h"
 
-RCSID("$Id: spider.c,v 1.53 1998/02/10 15:44:57 per Exp $");
+RCSID("$Id: spider.c,v 1.54 1998/02/11 00:27:01 per Exp $");
 
 #ifdef HAVE_PWD_H
 #include <pwd.h>
@@ -1300,13 +1301,13 @@ void *do_shuffle(void *_a)
   while(!fail && a->len)
   {
     int nread, ts=0;
-    nread = read(a->from_fd, buffer, 8192);
+    nread = fd_read(a->from_fd, buffer, 8192);
     if(nread <= 0)
       break;
 
     while(nread)
     {
-      int nsent = write(a->to_fd, buffer, nread);
+      int nsent = fd_write(a->to_fd, buffer, nread);
       if(nsent < 0) 
       {
 	fail=1;
@@ -1326,6 +1327,7 @@ void *do_shuffle(void *_a)
   a->next = done;
   done = a;
   mt_unlock(&done_lock);
+  wake_up_backend();
   return 0;
 }
 
@@ -1354,11 +1356,8 @@ void finished_p(struct callback *foo, void *b, void *c)
     free(d);
   }
 
-  if(num_shuffles)
+  if(!num_shuffles)
   {
-    next_timeout = current_time;
-    next_timeout.tv_usec += 40000;
-  } else {
     remove_callback( foo );
     my_callback = 0;
   }
@@ -1379,20 +1378,13 @@ void f_shuffle(INT32 args)
   a->from->refs++; 
   a->to->refs++; 
   
-  a->cb = *q;
-  a->args = *w;
-  if(a->cb.type <= MAX_REF_TYPE)   a->cb.u.refs[0]++; 
-  if(a->args.type <= MAX_REF_TYPE) a->args.u.refs[0]++;
+  assign_svalue_no_free(&a->cb, q);
+  assign_svalue_no_free(&a->args, w);
   
   th_create_small(&a->tid, do_shuffle, (void *)a);
 
   if(!my_callback)
-  {
-/*  next_timeout = current_time; */
-/*  next_timeout.tv_usec += 40000; */
     my_callback = add_backend_callback( finished_p, 0, 0 );
-    wake_up_backend();
-  }
 
   pop_n_elems(args+2);
 }