completed with lots of changes :D