Reimplement waiters
Add new tests