  Undo and redo functionality is ubiquitous in collaboration software. In
single user settings, undo and redo are well understood. However, when multiple
users edit a document, concurrency may arise, leading to a non-linear operation
history. This renders undo and redo more complex both in terms of their
semantics and implementation. We survey the undo and redo semantics of current
mainstream collaboration software and derive principles for undo and redo
behavior in a collaborative setting. We then apply these principles to a simple
CRDT, the Multi-Valued Replicated Register, and present a novel undo and redo
algorithm that implements the undo and redo semantics that we believe are most
consistent with users' expectations.
