implemented a lot more