#3, handle read/write callback