implement all needed features