diff --git a/lib/include/fifo.pre.pike b/lib/include/fifo.pre.pike
index 9cb4f0a82a72e0d8d601e452473467731c307a72..a9ddd6f6b968ae14505f9b2f7582994d61cda237 100644
--- a/lib/include/fifo.pre.pike
+++ b/lib/include/fifo.pre.pike
@@ -8,14 +8,15 @@ void create()
     mixed *buffer;
     int r_ptr, w_ptr;
 
-    int query_messages()    {  return w_ptr - r_ptr;  }
+    int size() {  return (w_ptr+sizeof(buffer) - r_ptr) % sizeof(buffer);  }
     
     mixed read()
     {
       mixed tmp;
       object key=lock::lock();
-      while(!query_messages()) r_cond::wait(key);
-      tmp=buffer[r_ptr++ % sizeof(buffer)];
+      while(!size()) r_cond::wait(key);
+      tmp=buffer[r_ptr];
+      if(++r_ptr >= sizeof(buffer)) r_ptr=0;
       w_cond::signal();
       return tmp;
     }
@@ -23,8 +24,9 @@ void create()
     void write(mixed v)
     {
       object key=lock::lock();
-      while(query_messages() == sizeof(buffer)) w_cond::wait(key);
-      buffer[w_ptr++ % sizeof(buffer)]=v;
+      while(size() == sizeof(buffer)) w_cond::wait(key);
+      buffer[w_ptr]=v;
+      if(++w_ptr >= sizeof(buffer)) r_ptr=0;
       r_cond::signal();
     }
 
@@ -33,4 +35,38 @@ void create()
       buffer=allocate(size || 128);
     }
   });
+
+  master()->add_precompiled_program("/precompiled/queue", class {
+    inherit "/precompiled/condition": r_cond;
+    inherit "/precompiled/mutex": lock;
+
+    mixed *buffer=allocate(16);
+    int r_ptr, w_ptr;
+
+    int size() {  return w_ptr - r_ptr;  }
+    
+    mixed read()
+    {
+      mixed tmp;
+      object key=lock::lock();
+      while(!size()) r_cond::wait(key);
+      tmp=buffer[r_ptr++];
+      return tmp;
+    }
+
+    void write(mixed v)
+    {
+      object key=lock::lock();
+      if(w_ptr >= sizeof(buffer))
+      {
+	buffer=buffer[r_ptr..];
+	buffer+=allocate(sizeof(buffer)+1);
+	w_ptr-=r_ptr;
+	r_ptr=0;
+      }
+      buffer[w_ptr]=v;
+      w_ptr++;
+      r_cond::signal();
+    }
+  });
 }