The interface exposed by WALObserver is quite minimal. To implement anything of significance based on WAL events, WALActionsListener (at a minimum) is required. This is demonstrated by the implementation of the replication feature (not currently possible with coprocessors) and the corresponding interface exploitation that is the Side-Effect Processor. Consider promoting the interface of WALActionsListener into WALObserver. This goes a long way to being able refactor replication into a coprocessor. This also removes the duplicate code path for listeners because they're already available via coprocessor hook.