same signature as remove()