complete CRUD functionality