all functionality implemented - not tested