all functionality now implemented