diff --git a/lib/include/fifo.h b/lib/include/fifo.h
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/lib/include/fifo.h
@@ -0,0 +1 @@
+
diff --git a/lib/include/fifo.pre.pike b/lib/include/fifo.pre.pike
new file mode 100644
index 0000000000000000000000000000000000000000..9cb4f0a82a72e0d8d601e452473467731c307a72
--- /dev/null
+++ b/lib/include/fifo.pre.pike
@@ -0,0 +1,36 @@
+void create()
+{
+  master()->add_precompiled_program("/precompiled/fifo", class {
+    inherit "/precompiled/condition": r_cond;
+    inherit "/precompiled/condition": w_cond;
+    inherit "/precompiled/mutex": lock;
+
+    mixed *buffer;
+    int r_ptr, w_ptr;
+
+    int query_messages()    {  return w_ptr - r_ptr;  }
+    
+    mixed read()
+    {
+      mixed tmp;
+      object key=lock::lock();
+      while(!query_messages()) r_cond::wait(key);
+      tmp=buffer[r_ptr++ % sizeof(buffer)];
+      w_cond::signal();
+      return tmp;
+    }
+
+    void write(mixed v)
+    {
+      object key=lock::lock();
+      while(query_messages() == sizeof(buffer)) w_cond::wait(key);
+      buffer[w_ptr++ % sizeof(buffer)]=v;
+      r_cond::signal();
+    }
+
+    varargs void create(int size)
+    {
+      buffer=allocate(size || 128);
+    }
+  });
+}