implement undo/redo (just an experimental)