implement base functionality