implement compound keys and change events