rethink everything and make more asynchronus