fully functional. next stage is to check, then polish