diff --git a/src/libfibre/EventEngine.h b/src/libfibre/EventEngine.h
index bf09f0a6deb90c81a8b73a05db7999532953209c..b3b6157f96f463c17ef9f00a9c5bc812b8f409ef 100644
--- a/src/libfibre/EventEngine.h
+++ b/src/libfibre/EventEngine.h
@@ -187,13 +187,10 @@ T lfDirectIO( T (*diskfunc)(int, Args...), int fd, Args... a) {
   return _lfEventEngine->directIO(diskfunc, fd, a...);
 }
 
-// socket creation: on FreeBSD, do not register SOCK_STREAM yet (cf. listen, connect)
+// socket creation: do not register SOCK_STREAM yet (cf. listen, connect) -> mandatory for FreeBSD
 static inline int lfSocket(int domain, int type, int protocol) {
   int ret = socket(domain, type | SOCK_NONBLOCK, protocol);
-#if __FreeBSD__
-  if (type != SOCK_STREAM)
-#endif
-  if (ret >= 0) _lfEventEngine->registerFD(ret);
+  if (ret >= 0 && type != SOCK_STREAM) _lfEventEngine->registerFD(ret);
   return ret;
 }
 
@@ -209,12 +206,10 @@ static inline int lfBind(int fd, const sockaddr *addr, socklen_t addrlen) {
   return ret;
 }
 
-// FreeBSD: can register SOCK_STREAM server fd only after 'listen' system call (cf. socket/connect)
+// register SOCK_STREAM server fd only after 'listen' system call (cf. socket/connect)
 static inline int lfListen(int fd, int backlog) {
   int ret = listen(fd, backlog);
-#if __FreeBSD__
   _lfEventEngine->registerFD(fd);
-#endif
   return ret;
 }
 
@@ -232,11 +227,9 @@ static inline int lfAccept(int fd, sockaddr *addr, socklen_t *addrlen, int flags
   return ret;
 }
 
-// see man 3 connect for EINPROGRESS; FreeBSD: register SOCK_STREAM fd now (cf. socket/listen)
+// see man 3 connect for EINPROGRESS; register SOCK_STREAM fd now (cf. socket/listen)
 static inline int lfConnect(int fd, const sockaddr *addr, socklen_t addrlen) {
-#if __FreeBSD__
   _lfEventEngine->registerFD(fd);
-#endif
   int ret = connect(fd, addr, addrlen);
   if (ret < 0 && errno == EINPROGRESS) {
     _lfEventEngine->registerLazyFD(fd);
@@ -254,4 +247,8 @@ static inline int lfDup(int fd) {
   return ret;
 }
 
+static inline int lfClose(int fd) {
+  return close(fd);
+}
+
 #endif /* _EventEngine_h_ */
diff --git a/src/libfibre/Fibre.h b/src/libfibre/Fibre.h
index 3484825f51794edd41277a0c9ffa2db6952099f7..75b426a36ce7c3abc61d1108229c3dfe90d198a3 100644
--- a/src/libfibre/Fibre.h
+++ b/src/libfibre/Fibre.h
@@ -72,6 +72,13 @@ class Fibre : public StackContext {
 #endif
   }
 
+  void clearDebug() {
+#if TESTING_ENABLE_DEBUGGING
+    ScopedLock<SystemLock> sl(*_globalStackLock);
+    GlobalStackList::remove(*this);
+#endif
+  }
+
   Fibre* runInternal(ptr_t func, ptr_t p1, ptr_t p2, ptr_t p3) {
     StackContext::start(func, p1, p2, p3);
     return this;
@@ -95,16 +102,15 @@ public:
   : StackContext(sp), stackSize(0) { initDebug(); }
 
   // synchronize at object destruction
-  ~Fibre() { join(); }
+  ~Fibre() {
+    join();
+    clearDebug();
+  }
   void join() { done.wait(); }
   void detach() { done.detach(); }
 
   // callback from StackContext via Runtime after terminal context switch
   void destroy(_friend<Runtime>) {
-#if TESTING_ENABLE_DEBUGGING
-    ScopedLock<SystemLock> sl(*_globalStackLock);
-    GlobalStackList::remove(*this);
-#endif
     stackFree();
     done.post();
   }
diff --git a/src/libfibre/FibreCluster.h b/src/libfibre/FibreCluster.h
index c9807a587fc035f9d5e0c82e62d6a09ca3010e02..2739d6b59260989fbc4f22f1e6dcede33a39ad82 100644
--- a/src/libfibre/FibreCluster.h
+++ b/src/libfibre/FibreCluster.h
@@ -87,12 +87,7 @@ public:
 
 #if !TESTING_POLLER_FIBRES
   bool waitForPoll() {
-#if TESTING_POLLER_IDLEWAIT
-    ScopedLock<SystemLock> al(idleLock);
-    return poller.wait(idleLock, idleCount);
-#else
-    return false;
-#endif
+    return poller.wait(idleCount);
   }
 #endif
 };
diff --git a/src/libfibre/Poller.cc b/src/libfibre/Poller.cc
index 50d77e3a0ee39a841b814490890650f4f19e41fe..4e1460a5f0a3aed165203296d455d454aba00520 100644
--- a/src/libfibre/Poller.cc
+++ b/src/libfibre/Poller.cc
@@ -134,7 +134,7 @@ void* Poller::pollLoopSetup(void* This) {
 }
 
 inline int Poller::blockingPoll() {
-  if (!cluster.waitForPoll()) usleep(100);  // avoid trickle loop
+  cluster.waitForPoll();
   return PollerThread::blockingPoll();
 }
 
diff --git a/src/libfibre/Poller.h b/src/libfibre/Poller.h
index fb01678ccf6e188d078458165319c0d42af51c2e..055ebc619717dab4972d093376e3bc518a6980de 100644
--- a/src/libfibre/Poller.h
+++ b/src/libfibre/Poller.h
@@ -195,8 +195,9 @@ class Poller : public PollerThread {
   FibreClusterGeneric<Poller>& cluster;
 
 #if TESTING_POLLER_IDLEWAIT
-  size_t                       pollThreshold;
-  SystemCondition              pollCond;
+  size_t          pollThreshold;
+  SystemLock      pollLock;
+  SystemCondition pollCond;
 #endif
 
   static void* pollLoopSetup(void*);
@@ -212,19 +213,21 @@ public:
   inline int blockingPoll();
 
 #if TESTING_POLLER_IDLEWAIT
-  bool wait(SystemLock& lock, size_t count) {
+  bool wait(size_t count) {
+    ScopedLock<SystemLock> al(pollLock);
     if (count >= pollThreshold) return false;
 #if TESTING_POLLER_IDLETIMEDWAIT
     Time t;
     SYSCALL(clock_gettime(CLOCK_REALTIME, &t));
-    pollCond.wait(lock, t + Time(0,10000000));    // 10 ms = 10,000,000 ns;
+    pollCond.wait(pollLock, t + Time(0,1000000));    // 1 ms = 1,000,000 ns;
 #else
-    pollCond.wait(lock);
+    pollCond.wait(pollLock);
 #endif // TESTING_POLLER_IDLETIMEDWAIT
     return true;
   }
 
   void signal(size_t c) {
+    ScopedLock<SystemLock> al(pollLock);
     if (c == pollThreshold) pollCond.signal();
   }
 
@@ -234,6 +237,8 @@ public:
     pollCond.signal();
 #endif // !TESTING_POLLER_IDLETIMEDWAIT
   }
+#else
+  bool wait(size_t) { return false; }
 #endif // TESTING_POLLER_IDLEWAIT
 
 };
@@ -247,7 +252,7 @@ public:
   void stop() {}
   void pause() {}
   void resume() {}
-  bool wait(SystemLock&, size_t) { return false; }
+  bool wait(size_t) { return false; }
   void signal(size_t) {}
   void finish() {}
 };
diff --git a/src/libfibre/cfibre.cc b/src/libfibre/cfibre.cc
index 737c9c40d56c456c70736e2ba2bc18597ad2c290..d0f5b2ec2e83c5b4ce27f5f14dc311588949fdd2 100644
--- a/src/libfibre/cfibre.cc
+++ b/src/libfibre/cfibre.cc
@@ -374,6 +374,10 @@ extern "C" int cfibre_dup(int fd) {
   return lfDup(fd);
 }
 
+extern "C" int cfibre_close(int fd) {
+  return lfClose(fd);
+}
+
 extern "C" ssize_t cfibre_send(int socket, const void *buffer, size_t length, int flags) {
   return lfOutput(send, socket, buffer, length, flags);
 }
diff --git a/src/libfibre/cfibre.h b/src/libfibre/cfibre.h
index 9efea93eb1286b8be98c88654afe5583457b3074..2d691846f229f562143492e27029f259794c2fb8 100644
--- a/src/libfibre/cfibre.h
+++ b/src/libfibre/cfibre.h
@@ -139,6 +139,7 @@ int cfibre_accept(int socket, struct sockaddr *restrict address, socklen_t *rest
 int cfibre_accept4(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len, int flags);
 int cfibre_connect(int socket, const struct sockaddr *address, socklen_t address_len);
 int cfibre_dup(int fildes);
+int cfibre_close(int fildes);
 ssize_t cfibre_send(int socket, const void *buffer, size_t length, int flags);
 ssize_t cfibre_sendto(int socket, const void *message, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t dest_len);
 ssize_t cfibre_sendmsg(int socket, const struct msghdr *message, int flags);
diff --git a/src/libfibre/echotest.cpp b/src/libfibre/echotest.cpp
index 5ad3abbdb81c2074279f72db563a832e66c89b1d..6a831163ee8738ba29cb80ce29bed23c5edad4ee 100644
--- a/src/libfibre/echotest.cpp
+++ b/src/libfibre/echotest.cpp
@@ -132,7 +132,7 @@ finish:
 //  std::cout << ntohs(client.sin_port) << " client closed" << std::endl;
 
   // close socket and terminate fibre
-  SYSCALL(close(fd));
+  SYSCALL(lfClose(fd));
 }
 
 void servaccept(void* arg) {
@@ -215,7 +215,7 @@ void servmain(sockaddr_in& addr) {
   }
 
   // close server socket
-  SYSCALL(close(servFD));
+  SYSCALL(lfClose(servFD));
 }
 
 void clientconn(void* arg) {
@@ -252,7 +252,7 @@ void clientconn(void* arg) {
   if (buf == code) __atomic_add_fetch(&clntcount, 1, __ATOMIC_RELAXED);
 
   // close socket and terminate fibre
-  SYSCALL(close(fd));
+  SYSCALL(lfClose(fd));
 }
 
 void clientmain(sockaddr_in& addr) {
diff --git a/src/libfibre/webserver.cpp b/src/libfibre/webserver.cpp
index 032a9096f681e766d6ad6ec4df7bdb132c487404..04a5193691db37ba51d6cf174c31a187bdaf77c7 100644
--- a/src/libfibre/webserver.cpp
+++ b/src/libfibre/webserver.cpp
@@ -44,9 +44,9 @@ typedef cpuset_t cpu_set_t;
 #define __LIBFIBRE__
 #include "libfibre/Fibre.h"
 #include "libfibre/EventEngine.h"
-typedef Mutex<SystemLock>                 FibreMutex;
-typedef Condition<FibreMutex>             FibreCondition;
-typedef Barrier<SystemLock>               FibreBarrier;
+typedef Mutex<SystemLock>     FibreMutex;
+typedef Condition<FibreMutex> FibreCondition;
+typedef Barrier<SystemLock>   FibreBarrier;
 
 #else /* VARIANT */
 
@@ -67,9 +67,10 @@ static void _SYSCALLabort() { abort(); }
 #include "uSocket.h"
 #else
 #define lfSocket socket
-#define lfBind bind
+#define lfBind   bind
 #define lfListen listen
 #define lfAccept accept
+#define lfClose  close
 template<typename T, class... Args>
 T lfInput( T (*readfunc)(int, Args...), int fd, Args... a) {
   return readfunc(fd, a...);
@@ -266,7 +267,7 @@ closeAndOut:
 #if defined __U_CPLUSPLUS__
   delete (uSocketAccept*)connFD;
 #else
-  close((uintptr_t)connFD);
+  SYSCALL(lfClose((uintptr_t)connFD));
 #endif
   return false;
 }
@@ -334,7 +335,7 @@ static void acceptor(void* arg) {
 #if defined __U_CPLUSPLUS__
   if (!arg) delete servFD;
 #else
-  if ((intptr_t)arg < 0) SYSCALL(close(servFD));
+  if ((intptr_t)arg < 0) SYSCALL(lfClose(servFD));
 #endif
 }
 
@@ -360,7 +361,7 @@ static void acceptor_loop(void* arg) {
 #if defined __U_CPLUSPLUS__
   if (!arg) delete servFD;
 #else
-  if ((intptr_t)arg < 0) SYSCALL(close(servFD));
+  if ((intptr_t)arg < 0) SYSCALL(lfClose(servFD));
 #endif
 }
 
@@ -484,7 +485,7 @@ int main(int argc, char** argv) {
 #if defined __U_CPLUSPLUS__
     delete servFD;
 #else
-    SYSCALL(close(servFD));
+    SYSCALL(lfClose(servFD));
 #endif
   }