needs optional blocking and multithreading :P