Full functional undo/redo