all the basic functionality implemented