add put and forceput, refactor