implement undo. fixes #31