added multi-threading
removed observer pattern