all the basic functionality (no error handling)