Everything implemented, just need to test