aggressively cache the JSON representation
add change event