Here is the design of the audit framework for everyone's review: https://issues.apache.org/jira/browse/CAY-2030
The way it will work from the user perspective is this: // bootstrap the filter by adding an extra Cayenne-provided module to // runtime. Optionally add your own module that overrides context provider // (e.g. to store request IP address and user name). ServerRuntime r = ServerRuntimeBuilder.builder().addModule(new WhateverModuleNameWeUse()).build(); // register listener r.getDataDomain().addListener(new MyListener()); // listener code class MyListener { @PostCommit void processAsChangeset(Map<ObjectId, ObjectChangeSet> map) {..} // optionally can take a changeset serialized to JSON @PostCommit void processAsJSON(Map<ObjectId, String> map) {..} } Andrus