Each action (create, update or delete) that a user performs on data is broadcasted and stored as an event. Such an event contains the data (no more and no less) that's necessary to undo or redo the action, a timestamp and a reference to the user who did it.
These events are stored in an audit trail, and can thus be viewed, undone, redone, etc.
The architecture of the application is such that these events are the source of all changes in the user interface, caches, database and audit trail. Each action of the user first creates an event, than this event is applied to the user interface and so on.