undo/redo is half implemented don't touch yet